C语言之指针、数组和函数

指针和函数的关系

  • 作用:通过指针间接访问某个内存
  • 定义一个函数考虑什么情况下参数是指针,这个函数会不会改变传递过来的数据本身 ,需要改变外部的值 就将这个变量定义为指针变量


#include <stdio.h>

void test(int *pa, int *pb){
    (*pa)++;
    (*pb)++;
}
int main(){
    int a = 10;
    int b = 20;
    test(&a,&b);
    
    printf("a:%d\n",a);
    printf("b:%d",b);
return 0;
} 
输出结果:
a:11
b:21

数组、函数、指针(输入一个num数组,输出时使每个元素都加一)

  • 函数接收数组时,必须知道数组元素个数。函数里面是通过指针变量来接收数组的地址,指针变量无法确定指向的内容的大小
  • 访问数组有两种方式
  1. num[3]
  2. *(num+3)
#include <stdio.h>

//void test(int p[], int count){
void test2(int *p, int count){
    for (int i = 0; i < count; i++){
        p[i]++; //p[i] += 1;
        //*((p + i))++; //*(p + i) += 1;
        //*((p+i)++); 错在哪里 不能对表达式++ -- 
    }
}
int main(){
    int a = 10;
    a++; a = a + 1;
    2++; 2 = 2 + 1;
    int b = 20;
    test(&a, &b);
    printf("a:%d b:%d\n", a, b);
    
    int num[5] = {1,2,3,4,5};
    test2(num,5);
    
    for(int i = 0; i < 5; i++){
        printf("%d ", num[i]);
    }

    return 0;
}

内存的分配

  • 常量字符串的内存空间有系统自动分配,在常量区里面分配,当程序结束才会被释放 。
  • 常量区 - 常量 const int a = 1;
  • 静态区 static
  • 栈 局部变量 int a = 10;离开作用域就自动收回
  • 堆 自己申请的内存 malloc calloc realloc必须自己释放

常量字符串

#include <stdio.h>


char* test(){
    char *name = "jack";//常量字符串 
    return name;
} 
int main(){
    char *p ;
    p = test();
    
    printf("-%s\n", p);
    return 0;
}
输出结果:jack

上边程序中jack是一个常量字符串,所以最终显示出来的是jack(当程序最终才被释放)

申请的栈

#include <stdio.h>

char *test(){
    char name[10] = {'j','a','c','k'};
    return name;
} 
int main(){
    char *p ;
    p = test();
    
    printf("-%s\n", p);
    return 0;
}
此时输出结果为乱码,不会输出jack

上边程序是由于jack被释放,成为了野指针

静态变量

#include <stdio.h>

void test(){
    //静态变量只会被定义一次,生命周期是整个程序 
    static int count = 0;
    count++;
    printf("count:%d\n",count);
}

int main(){
    
    test();
    test();
    return 0;
} 
输出结果:
count:1
count:2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容