若触过汇编语言,那么理解学习C语言中指针就很简单了。指针,在汇编里面的表现形式,无非就是寻址,直接寻址和间接寻址。
先来学习下, C语言中的4大类数据类型:
基本类型:int,long,float,char
构造类型:数组,结构体-struct,联合体-union, 枚举类型-enum
指针类型:int*, long*, float*, char* 等等
空类型 :void
如上,指针是一种数据类型,如同整数型有int,long,float,short ,
指针型下面也有int*,long*,float*, char*, struct* 等等。
举例说明:定义一个int型指针。
int a=12345; //定义了一个整型变量a,同时给a赋值12345
int* pa=&a; //定义了一个指针名叫pa,它指向的是一个整数a。也可叫pa是个整型的指针。
//对int 后面加个*,就表示这个变量pa,不是int整型了,而是整型指针了。
&a表示取到变量a的地址, 这个地址一般是一个32位的数据,地址内放的值是12345。
int* pa=&a; 表示把变量a的地址当做数据,赋值给变量pa。
这里需要理解变量地址和地址存的数据(变量的值),这两个概念。
地址就好比你家的地址,买东西要填写的收获地址;
地址内的数据就好比你家的房子;
仔细看下面的代码:
我这里显示变量a的地址是0x0019 fedc ,地址值应该是4字节的,前面两00可以省略不显示的。
从上面的例子可以看到,指针变量pa地址内的存放的是 整型变量a的地址,也可以说变量pa的值是 变量a的地址。
而常说的-指针变量pa指向的值,在这里就是变量a的值=12345; *pa 就是取值的意思,程序执行*pa的操作是,选取到pa内存的值,然后把这个值当做"地址",在去取这个“地址”内存放的值。
举个例子,说明下: 老板让你去客户的公司拿个材料(即从客户处取个数据), 但是没直接告诉客户公司的地址,咋整??
这时,老板说,客户公司的地址我写在我的笔记本上,但笔记本放在了我家里。 我这里给你个纸条,上面是我家的地址,你先到我家,拿到笔记本,看上面客户的公司地址,在去客户公司,把材料拿回来。
下面例子:指针的指针 int** p
int a = 12345; //定义个整数
int* pa=&a; //定义一个指针(整数型的),也叫一个指向整数的指针,也叫整数指针。int** ppa; //一个指针,它指向的是"另外一个指针",另外一个指针指向的是一个整数。
// 解释:* 表示ppa 是个指针, int* 一个值想整数的指针
ppa = &pa; //ppa的值是 整型指针变量pa的地址。printf("变量a的地址=0x%x \n",&a);
printf("变量a的值=%d \n",a);printf("变量pa的地址=0x%x \n",&pa);
printf("变量pa地址内存的是=0x%x \n",pa);
printf("变量pa是个整型指针,它指向的值=%d \n", *pa);printf("指针的指针ppa地址内存的值是=0x%x \n", ppa); //变量pa的地址
printf("*ppa=0x%x \n", *ppa); //变量a的地址
printf("指针的指针ppa最终指向的值是=%d \n", **ppa); //变量a的值
//只要高兴,还可以跟多层的指针,暂时觉得没毛用
int*** pppa;
int**** ppppa;
int aa[10] = {0,1,2,3,4,5,6,7,8,9}; //定义了一个数组,里面放了10个整数,aa也可叫整型数组
int* bb[10]; //声明了一个数组叫bb,长度10.里面放的数据是整数指针。bb[0] = pa; //bb[0] 是数组bb的第1个数据,它是整型指针。
//可以理解为 int* bb[0], bb[0] 是个变量名, 对比 int* pa.
//所以可以有 bb[0]=pa;printf("变量a的地址=0x%x \n",&a);