【C语言】指针超详细讲解(超级详细!!!快来看快来看!!!)

小明 2025-04-29 15:31:47 5

目录

  • 初阶指针
    • 一、指针的概念
    • 二、指针和指针类型
      • 1. 为什么指针有多种类型??
      • 2. 指针+-整数的意义是什么??
      • 3. 指针+-指针有什么意义??
      • 4. 得到了变量的地址有什么用呢??(指针解引用)
      • 三、野指针
        • 1. 野指针是什么??
        • 2. 什么情况会造成野指针??
        • 3. 如何能够防止野指针的出现??
        • 四、指针和数组
        • 五、二级指针
        • 进阶指针
          • 一、字符指针
          • 二、指针数组
            • 1. 指针数组的定义
            • 2. 指针数组的使用
            • 三、数组指针
              • 1. 如何定义数组指针??
              • 2. 数组的地址和数组首元素的地址的区别
              • 四、函数指针
                • 1. 函数指针的定义
                • 2. &(函数名) vs(函数名)
                • 五、函数指针数组
                  • 1. 函数指针数组的定义
                  • 2. 函数指针数组的使用
                  • 六、指向函数指针数组的指针
                    • 函数指针数组的指针的定义
                    • 七、回调函数
                      • 1. 回调函数的定义
                      • 2. 回调函数的使用
                      • ���尾

                        初阶指针

                        一、指针的概念

                        • 指针??是??
                          1. 指针是内存中一个最小单元的编号,也就是地址
                          2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

                          所以说:指针就是地址,人们口中的指针变量也是指针。

                          • 指针变量??是??

                            我们可以通过&(取地址操作符)取出变量的内存与实地址,把地址可以存放到一个变量中,这个变量就是指针变量。

                            int main()
                            {
                            	int c = 520;    //将520赋给c
                            	int* ch = &c;	//将整形c的地址取出来放在ch中
                            	printf("%p", ch);
                            	return 0;
                            }
                            
                            • 指针变量的大小??是??

                              指针的大小在32位平台是4个字节,在64位平台是8个字节。

                              二、指针和指针类型

                              1. 为什么指针有多种类型??

                              • 变量有多种类型,那么指针也会也有多种类型吧??

                                是的,不同类型的变量的地址就应该放在对应的指针变量中。

                                int main()
                                {
                                	int a = 0;
                                	int* pa = &a;
                                	double b = 0;
                                	double* pb = &pb;
                                	char c = 'w';
                                	char* pc = &c;
                                	return 0;
                                }
                                

                                2. 指针±整数的意义是什么??

                                • 明明都是地址,为什么要区分是什么类型的呢??

                                  那是因为不同类型的指针±整数所跳过的字节数不同。

                                  int main()
                                  {
                                  	int a = 0;
                                  	int* pa = &a;
                                  	printf("%p %p\n", pa, pa + 1);
                                  	double b = 0;
                                  	double* pb = &pb;
                                  	printf("%p %p\n", pb, pb + 1);
                                  	char c = 'w';
                                  	char* pc = &c;
                                  	printf("%p %p\n", pc, pc + 1);
                                  	return 0;
                                  }
                                  

                                  从上图中我们可以看出:

                                  int*类型的指针 + 1 是跳过四个字节

                                  double*类型的指针 + 1 是跳过八个字节

                                  char*类型的指针 + 1 是跳过一个字节

                                  诶,看着很眼熟??

                                  int 类型变量的大小是 四个字节?

                                  double类型变量的大小是八个字节?

                                  char类型变量的大小是一个字节?

                                  难道?难道?没错!!!就是你猜想的那样…

                                  指针±整数对应的是指针向前/向后移动的大小(指针指向变量类型大小 * 整数)


                                  3. 指针±指针有什么意义??

                                  • 指针加整数有意义,那么指针 + - 指针呢??也有意义吗??

                                    你猜对了!!一半 !!

                                    指针 + 指针是没有意义的,但是指针 - 指针是有意义的哟!!

                                    指针 - 指针的结果是两个指针之间所隔的元素个数,这种操作通常用于计算数组中两个元素之间的距离。


                                    4. 得到了变量的地址有什么用呢??(指针解引用)

                                    指针的作用就是通过地址取访问指针指向的变量。

                                    指针的类型决定了指针解引用能够访问的字节数。

                                    例如上面的int*类型的指针,解引用能访问四个字节,double*类型的指针可以访问八个字节,char*类型的指针能够访问一个字节


                                    三、野指针

                                    1. 野指针是什么??

                                    野指针是指指向未知内存位置或者已经释放内存的指针。

                                    2. 什么情况会造成野指针??

                                    引用未初始化的指针、访问已释放内存、数组边界越界等行为都可能导致野指针。

                                    • 解引用未初始化的指针
                                      int main()
                                      {
                                      	int* pa = NULL;
                                      	printf("%d", *pa);
                                      	return 0;
                                      }
                                      
                                      • 数组的越界访问
                                        int main()
                                        {
                                        	char ch[4] = "Love";
                                        	for (int i = 0; i 
                                        		printf("%c ", ch[i]);
                                        	}
                                        	return 0;
                                        }
                                        
                                        	//动态申请4个char类型大小的空间
                                        	char* ch = (char*)malloc(sizeof(char) * 4);
                                        	if (ch == NULL)
                                        	{
                                        		return 0;
                                        	}
                                        	for (int i = 0; i 
The End
微信