C语言指针进阶讲解1

目录

指针

指针字符

指针数组

数组指针

数组名

指针

        指针就是一个变量,用来存放地址的,地址是唯一标识这块内存空间(内存会划分为小的内存单元,每一个内存单元都有一个编号,也称为地址,叫做指针),可以通过地址访问到这块空间的数据,就像生活中的手机号一样,通过手机号找到人。

        指针的大小是固定的,4个字节或者8个字节,取决于是多少位的平台,32位平台,指针是4个字节;64位平台,指针是8个字节。 

        指针有类型,指针的类型决定了指针能够访问多少数据。char指针,能够访问一个字节;int指针,能够访问四个字节......

        指针的运算。指针 + 整数、指针 - 整数、指针 - 指针......

指针字符

C语言指针进阶讲解1_第1张图片

        并不是把这个字符串存在指针变量p里,而是存储字符串"abc"首元素a的地址0x00b77bcc;字符指针能够访问一个字节,所以对p解引用的时候,只能访问到a,字符串的地址是连续的,可以指针+整数访问到后面的字符串内容。 

C语言指针进阶讲解1_第2张图片

        p1和p2都字符串都是常量字符串,存储在常量区, 常量字符串是不能被修改的,内存空间中保存一份就可以了,所以p1和p2存储的是同一个常量字符串,地址也就相同,所以打印p1 == p2。

        用"abc"初始化数组arr1,用"abc"初始化数组arr2,此时内存就创建了两个数组,数组名表示首元素地址,他们分别使用不同的空间,所以他们的地址并不相同,不会打印arr1 == arr2。

指针数组

        存放指针的数组

int* arr1[10]        //存放整形指针的数组,数组的元素个数是10

char* arr2[5]       //存放字符指针的数组,数组的元素个数是5

        通过指针数组访问指针数据 

C语言指针进阶讲解1_第3张图片

        arr[i]找到指针数组的元素,再通过*解引用访问数据。

        通过指针数组访问指针数组数据

C语言指针进阶讲解1_第4张图片

        parr[i]找到指针数组中的元素,再通过下标[j]访问数组arr1、arr2、arr3的元素。

数组指针

        一个指向数组的指针,存放的数组的地址。

int* arr[10]        //指针数组,[] 的优先级比 * 高,arr先和[10]结合,说明arr是数组,数组元素类型是int*类型。

int (*p)[10]        //数组指针,先用()将 * 和 p结合,说明p是指针,(*p)再和[10]结合,表示指针p指向的是一个数组,数组元素类型是int类型。

C语言指针进阶讲解1_第5张图片

        arr是首元素的地址,则arr的类型是int*,加1跳过一个int类型4个字节。

        &arr[0]是首元素的地址,则&arr[0]的类型是int*,加1跳过一个int类型4个字节。

        &arr是整个数组的地址,则&arr的类型是int (*)[5],加1跳过整个数组,5个int类型的数组,即跳过20个字节。因为取的是整个数组的地址,所以是指针,先写*p,指针p指向的是数组,数组有5个元素,写成 *p[5],但是[] 的优先级比 * 高,这样表示p是数组,和原意不符,所以要用()括号先将*p括起来,(*p)[5],再写数组元素的类型,int (*p)[5],将指针变量去掉,就是它的类型,int (*)[5]。

char* arr[5];

用什么来存放&arr?

char* (*p)[5] = &arr;

数组名

        通常情况下,数组名就是数组首元素的地址。两个列外:

1.sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小。

2.&数组名,这里的数组名表示整个数组,&数组名,取出的是整个数组的地址,+1跳过整个数组。

C语言指针进阶讲解1_第6张图片

        实参传arr,arr是首元素的地址,就是&arr[0]的地址,取出的是第一行的数组,数组元素是5个int类型的数据,接收就需要一个数组指针 int (*p)[5] 来接收。(p + i)找到二维组数的第几行,*(p + i)解引用找到所在行的首元素地址,(*(p + i) + j)找到所在行的第j个元素的地址,*(*(p + i) + j)解引用找到该元素。

         感谢大家的观看,觉得文章写得不错的话,点赞、评论、关注支持一下,后续还会整理别的知识点,若文章编写出现错误,麻烦在评论或者私信一下,我看到后及时更改,谢谢。

你可能感兴趣的:(c语言,开发语言)