【C语言】指针概要 痛定思痛。 2024-03-17 16:42 63阅读 0赞 #### 文章目录 #### * 一、什么是指针 * 二、指针类型 * 三、野指针 * 四、二级指针 * 五、字符指针 * 六、数组指针 * * 定义 * 数组名 * 七、函数指针 ![在这里插入图片描述][c443cdd9983540d08196b77b4ef2f3f6.png] ## 一、什么是指针 ## 指针就是地址,口语中说的指针通常指的是指针变量。我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个变量就是指针变量。 一个指针变量多大? > * 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。 > * 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。 ## 二、指针类型 ## 指针的定义方式是: \*\*type + \*\*\* char\* 类型的指针是为了存放 char 类型变量的地址。 short\* 类型的指针是为了存放 short 类型变量的地址。 int\* 类型的指针是为了存放 int 类型变量的地址。 … **指针类型有什么意义呢?** 1. *指针的类型决定了指针向前或者向后走一步有多大(距离)。* int main() { int n = 10; char *pc = (char*)&n; int *pi = &n; printf("%p\n", &n); printf("%p\n", pc); printf("%p\n", pc+1); printf("%p\n", pi); printf("%p\n", pi+1); return 0; } ![在这里插入图片描述][79d1886776e5474db29e6538c56d86d4.png] 由运行结果可以看出,char型指针加1向后走了1个字节,int型加1向后走了4个字节。 2. *指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。* #include <stdio.h> int main() { int n = 0x11223344; char *pc = (char *)&n; int *pi = &n; *pc = 0; //观察执行这两句时内存的变化 *pi = 0; return 0; } ![在这里插入图片描述][918c18f4781944e59a00a24be0f99d7f.png] 由结果可看出char\* 的指针解引用只能访问一个字节,而 int\* 的指针的解引用就能访问四个字节。 ## 三、野指针 ## **野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)** ***野指针出现的原因:*** 1. 指针未初始化 #include <stdio.h> int main() { int *p;//指针未初始化,默认为随机值 return 0; } 1. 指针越界访问 #include <stdio.h> int main() { int arr[10] = { 0}; int *p = arr; int i = 0; for(i=0; i<=11; i++) { //当指针指向的范围超出数组arr的范围时,p就是野指针 *(p++) = i; } return 0; } * 指针指向的空间释放 ## 四、二级指针 ## 指针变量也是变量,是变量就有地址,指针变量的地址被称为二级指针。 ![在这里插入图片描述][c8c5edf1f3aa4edeb8f93d5b1f1c6922.png] * \*pp 通过对pp中的地址进行解引用,这样找到的是 pa, \*pp 其实访问的就是 p . * \*\*pp 先通过 \*pp 找到 p ,然后对 p 进行解引用操作: \*p ,那找到的是 a ## 五、字符指针 ## 在指针的类型中我们把char\*这种指针类型称为为字符指针 char str1[]="Hellow world"; char str2[]="Hellow world"; const char* str3="Hellow world"; const char* str4="Hellow world"; ![在这里插入图片描述][2e1ae6089710427fa221857edc87759b.png] **字符指针的一般使用方式为:** int main() { char ch = 'w'; char *pc = &ch; *pc = 'w'; return 0; } **还有另一种使用方式为:** int main() { const char* pstr = "hello world.";//这一句代码意思是将首字符的地址放在了patr上,而不是把字符串 printf("%s\n", pstr); return 0; } ## 六、数组指针 ## ### 定义 ### * 指针数组:存放指针的数组 * 数组指针:存放数组的地址 int* p1[10];//指针数组 int(*p2)[10];//数组指针 对于**int\* (p2) \[10\]** 解释:*p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。 这里要注意:\[ \] 的优先级要高于 \* 号的,所以必须加上()来保证p先和 \* 结合。 ### 数组名 ### int arr[10]; 数组名通常表示数组首元素地址,两个情况例外: 1. sizeof(数组名) 2. &数组名 这两种情况数组名表示整个数组 #include <stdio.h> int main() { int arr[10] = { 0 }; printf("arr = %p\n", arr); printf("&arr= %p\n", &arr); printf("arr+1 = %p\n", arr+1); printf("&arr+1= %p\n", &arr+1); return 0; } ![在这里插入图片描述][1cc75fa90ba94f7e8678f26d768573fa.png] 从程序运行结果可以看出&arr和arr,虽然值是一样的,但是意义却不一样。 &arr 表示的是数组的地址,而不是数组首元素的地址 &arr 的类型是: int(\*)\[10\] ,是一种数组指针类型 数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40 ## 七、函数指针 ## #include <stdio.h> void test() { printf("Hwllow world"); } int main() { printf("%p\n", test); printf("%p\n", &test); return 0; } ![在这里插入图片描述][bb74997522b2479eabe8d0a0fd607db4.png] 可以看出函数名也表示函数的地址,与&函数名一样,那么函数的地址存储到指针中应该如何表示呢 ![在这里插入图片描述][0a251036e8c742c088fbfc133ce1b95c.png] **回调函数** > 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 [c443cdd9983540d08196b77b4ef2f3f6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/58e568fb441a49e5993d0debf6858da5.png [79d1886776e5474db29e6538c56d86d4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/b7a08f6dc95f487389e0866013e6a042.png [918c18f4781944e59a00a24be0f99d7f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/609669af106d40c1bc577482860ef664.png [c8c5edf1f3aa4edeb8f93d5b1f1c6922.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/33935a6af177465a9769fa7909d61d31.png [2e1ae6089710427fa221857edc87759b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/d6c555bc1d4346ed9a0f08c085dc508b.png [1cc75fa90ba94f7e8678f26d768573fa.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/366ce771b6c944c8957100fa3e2fcd7e.png [bb74997522b2479eabe8d0a0fd607db4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/1afdb232588e41b9ae8d09e00f01e5b0.png [0a251036e8c742c088fbfc133ce1b95c.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/223bf1c25ca743049079541f8d084441.png
相关 【C语言】指针概要 文章目录 一、什么是指针 二、指针类型 三、野指针 四、二级指针 五、字符指针 六、数组指针 定义 数组名 痛定思痛。/ 2024年03月17日 16:42/ 0 赞/ 64 阅读
相关 C语言指针 C语言指针 1、 指针概述: 1、指针是一种数据类型,占用内存空间。用来保存内存地址。 2、空指针: 标准定义了NULL指针,它作为一个特殊的指针变量, Bertha 。/ 2023年05月31日 07:56/ 0 赞/ 23 阅读
相关 【C语言】指针 50、指针变量用来记录地址数据 51、只有记录了有效地址的指针变量才可以使用 52、声明指针变量时需要在变量名称前写\ 53、指针变量名称前加\可以表示指针所捆绑的存储区 亦凉/ 2022年06月12日 04:49/ 0 赞/ 294 阅读
相关 c语言指针 //指针怎么用 // (区分两个概念,指针变量和指向内容,指针变量只保存一个地址值,在这个地址值对应的内存中具体存放的东西叫做指向内内容) 用变量 ╰半夏微凉°/ 2022年06月04日 08:58/ 0 赞/ 300 阅读
相关 C语言指针 C语言中,指针尤为重要。 1可以把指针看作是一个数据类型。 ![SouthEast][] 打印结果: ![SouthEast 1][] 2 在指针声 今天药忘吃喽~/ 2022年05月31日 03:39/ 0 赞/ 293 阅读
相关 C 语言指针 1、CPU 访问内存,是通过内存地址来读写内存数据的,CPU 与内存条硬件之间有个地址总线,CPU 通过地址总线将要访问/写入的内存地址告诉内存条。 2、对于 CPU 而言地 拼搏现实的明天。/ 2022年05月29日 01:54/ 0 赞/ 320 阅读
相关 C语言指针 1、指针的基本知识 (1)定义 int \p; (2)赋值 1) int a;int p=&a 2) int a ;int p; 喜欢ヅ旅行/ 2022年03月26日 05:22/ 0 赞/ 337 阅读
相关 C语言:指针 今天研究了一下午终于把指针研究明白了 include<stdio.h> include<stdlib.h> int main() { 快来打我*/ 2022年03月25日 21:14/ 0 赞/ 349 阅读
相关 C语言-指针 1.指针和指针变量 > 内存区的每一个字节都有编号,这就是地址 > 如果在程序中定义了一个变量,在对程序进行编译和运行时,系统就会给这个变量分配内存单元,并确 àì夳堔傛蜴生んèń/ 2022年01月26日 11:17/ 0 赞/ 402 阅读
相关 C语言指针 变量的地址 我们已经知道,内存变量简称变量,在C语言中,每定义一个变量,系统就会给变量分配一块内存,而内存是有地址的。如果把计算机的内存区域比喻成一个 小咪咪/ 2021年11月10日 23:06/ 0 赞/ 507 阅读
还没有评论,来说两句吧...