【C语言】指针

【C语言】指针,第1张

一、

1.一个内存单元占一个字节

2.指针是个变量,用来存放内存单元的地址

3.int* p = &a; //p就是指针变量

4.在32位机器上,指针变量占4个字节。64位机器上,占8个字节

二、

1.不管指针类型是什么,指针变量的大小都是4个字节或8个字节。那指针还分类型做什么呢?

2.指针类型是为了指明指针进行解引用 *** 作时,可访问空间的大小(可以访问几个字节)

int* p;  //可以访问4个字节

char* p;  //可以访问1个字节

double* p;  //可以访问8个字节

3.指针类型决定了指针+1或-1时,向后或向前移几个字节(指针的步长)

int* p;

p+1;  //p向后移四个字节

4.野指针:指针指向的位置是不可知的,随机的。

5.可能导致指针变野指针的情况:

        ① 局部指针变量不初始化,会导致指针变成野指针:int* p;

        ② 指针越界访问

        ③ 指针指向的内存空间被释放后,指针就会变成野指针

int* fun()

{

        int a = 10;

        return &a;

}

int* p = fun();  //这里a的内存已经被释放了,p其实已经是野指针了。

*p = 20;

三、

1.指针的运算:

        ① 指针+-整数

        ② 指针-指针:得到的是两指针中间的元素个数,小地址-大地址得到的是负数。注意:一般是同一块空间的地址相减,比如同一个数组。

求字符串长度

int Mystrlen(char* str)

{

        //start指针指向首元素的地址

        char* start = str;

        //利用循环使end指针指向最后一个元素,也就是结束标志符

        char* end = str;

        while(*end != '\0')

        {

                end++;

        }

        //返回指针间的元素个数,也就是字符串的长度

        return end - start;

}

*--p = 0;  //先算--,再算*p = 0

2.在用指针写for循环条件时,应注意不要用第一个元素之前的地址来比较(p不要和p3比较),但可以用最后一个元素之后的地址比较(p1可以和p2比较)。

 四、

1.通常数组名是首元素的地址,但是:

        ①&arr,数组名表示整个数组的地址。&数组名,取出的是整个数组的地址

        ②sizeof(arr),数组名表示整个数组。sizeof(数组名),计算的是整个数组的大小

 2.二级指针

int a = 10;

int* pa = &a;

int** ppa = *pa;  //ppa就是二级指针,ppa的类型是int**,其中int*表示ppa指向的是int*类型的变量,*表示ppa是指针

**ppa = 20;  //等价于*pa = 20; a = 20;

3.指针数组和数组指针

① 指针数组 - 本质还是数组,是存放指针的数组,数组元素都是指针

int a = 10;

int b = 20;

int c = 30;

int* arr[3] = {&a, &b, &c};  //指针数组arr,将abc三个变量的地址放入数组里

*(arr[0]) = 20;  //等价于a = 20;

② 数组指针 - 本质还是指针 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/873184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存