
指针概述C语言中指针也可以认为是一种类型不同于数值型和字符型的类型。推演过去指针变量也就是相当于不同的变量类型不同于数值变量、字符型变量、字符串变量。指针变量两种类型自身类型和指向的类型自身类型将变量名去掉剩下的就是指针变量类型。指向类型将变量名和离它最近的一个*去掉剩下的类型就是指针指向的类型123intnum 10;int* p NULL;p num;如代码中 指针变量的自身类型是 int * 型指向类型是 int 型。自身类型自身类型是指变量p本身的类型变量p中放的是地址内容地址指向的是放整型的数据为什么需要说是指向整型的地址呢因为不同类型数据占据的不同大小的一整块内存整型是一个占4字节大小的一个整体内存字符型是一个占2个字节大小的一个整体内存编译器不会把它们拆分开。如定义了一个int型变量它的地址是0x7fffffff00紧接着马上定义一个char型变量他的地址就直接到了0x7fffffff04。从0x7fffffff00 ~ 0x7fffffff04中间不会再被分开了放int型数据0x7fffffff04 ~ 0x7fffffff06中间不分开放char型数据。所以 自身类型 是基本类型 *组合而成虽然里面放的都是地址但是地址指向的一整块内容是有区别的。指向类型指向类型 是指 指针变量中放置的地址是指向的内容类型。12345intnum 10;int* p NULL;p num;int** pp NULL;pp p;这是一个二级指针指向的类型是int*说明变量pp指向的是指针类型的数据。代码例子代码1123456789101112131415161718192021222324252627282930313233343536#include stdio.hintmain(){intnum 100;printf(num %d, num address %#lx\n, num, num);//num 100, num address 0x7ffd4376ff4cint* p NULL;p num;printf(*p %d, p %#lx, p %#lx\n, *p, p, p);//*p 100, p 0x7ffd4376ff4c, p 0x7ffd4376ff40int** pp NULL;pp p;printf(**pp %d, *pp %#lx, pp %#lx\n, **pp, *pp, pp);//**pp 100, *pp 0x7ffd4376ff4c, pp 0x7ffd4376ff40intarr[5] {10,20,30,40,50};printf(arr address %#lx, arr[0] address %#lx, arr[0] %d\n,arr,arr[0],arr[0]);//arr address 0x7ffd4376ff20, arr[0] address 0x7ffd4376ff20, arr[0] 10int* parr NULL;parr arr;printf(parr %#lx, *parr %d, *(parr2) %d\n,parr,*parr,*(parr2));//parr 0x7ffd4376ff20, *parr 10, *(parr2) 30charstr[6] {a,d,m,i,n,\0};printf(str address %#lx, str[0] address %#lx, str[1] %c\n, str, str[0],str[1]);//str address 0x7ffd4376ff10, str[0] address 0x7ffd4376ff10, str[1] dchar* pstr NULL;pstr str;printf(pstr %#lx,*pstr %c,*(pstr2) %c\n,pstr,*pstr,*(pstr2));//pstr 0x7ffd4376ff10,*pstr a,*(pstr2) mcharstr2[6] admin;printf(str2 %#lx, str2[0] address %#lx, str2 %s, str2[1] %c\n,str2,str2[0],str2,str2[1]);//str2 0x7ffd4376ff00, str2[0] address 0x7ffd4376ff00, str2 admin, str2[1] dchar* pstr2 NULL;pstr2 str2;printf(pstr2 %#lx, pstr2 %s\n,pstr2, pstr2);//pstr2 0x7ffd4376ff00, pstr2 admin}代码21234567891011121314151617181920212223242526272829303132333435#include stdio.hintmain(){floatnum 10;printf(num %f, num %#lx\n\n, num, num);//num 10.000000, num 0x7ffcdf7ffd94float* pnum num;printf(*pnum %f, pnum %#lx, pnum %#lx\n\n , *pnum, pnum, pnum);//*pnum 10.000000, pnum 0x7ffcdf7ffd94, pnum 0x7ffcdf7ffd88float** p_pnum pnum;printf(**p_pnum %f, *p_pnum %#lx, p_pnum %#lx\n\n,**p_pnum,*p_pnum,p_pnum);//**p_pnum 10.000000, *p_pnum 0x7ffcdf7ffd94, p_pnum 0x7ffcdf7ffd88chararr[10] {a,d,m,i,n};printf(arr[0] %c, arr[5] %c, arr[6] %c, arr %s\n,arr[0],arr[5],arr[6],arr);printf(arr[0] %#lx, arr[1] %#lx, arr %#lx\n\n, arr[0], arr[1], arr);//arr[0] a, arr[5] , arr[6] , arr admin//arr[0] 0x7ffcdf7ffd70, arr[1] 0x7ffcdf7ffd71, arr 0x7ffcdf7ffd70char* parr NULL;parr arr;printf(*parr %c, *(parr4)%c, *(parr5)%c, parr %s\n,*parr,*(parr4),*(parr5),parr);printf(parr %#lx, parr4 %#lx, parr5 %#lx\n\n, parr, parr4, parr5);//*parr a, *(parr4)n, *(parr5), parr admin//parr 0x7ffcdf7ffd70, parr4 0x7ffcdf7ffd74, parr5 0x7ffcdf7ffd75charstr[10]admin;printf(str[0] %c, str[5] %c, str[6] %c, str %s\n,str[0],str[5],str[6],str);printf(str[0] %#lx, str[1] %#lx, str %#lx\n\n, str[0], str[1], str);//str[0] a, str[5] , str[6] , str admin//str[0] 0x7ffcdf7ffd60, str[1] 0x7ffcdf7ffd61, str 0x7ffcdf7ffd60char* pstr NULL;pstr str;printf(*pstr %c, *(pstr4) %c, *(pstr5) %c, pstr %s\n, *pstr, *(pstr4), *(pstr5), pstr);printf(pstr %#lx, pstr4%#lx, pstr5 %#lx\n\n,pstr, pstr4, pstr5);//*pstr a, *(pstr4) n, *(pstr5) , pstr admin//pstr 0x7ffcdf7ffd60, pstr40x7ffcdf7ffd64, pstr5 0x7ffcdf7ffd65}数值型指针数值型指针int* p如1234intnum 100;int* p num;//同时定义和初始化int* p1 NULL;//定义p1 num;//初始化字符型指针字符型指针可以分为指针指向的是单字符还是字符数组两种单字符字符型指针char* p123charname a;char* p name;printf(p %c,*p);//结果是 a这里需要注意需要用 占位符 %c 去承接内容或者说显示内容字符数组字符型指针char* p1234567chararr[6] {a,d,m,i,n,\0};printf(arr %s, arr %#lx\n,arr,arr);//admin,0x7ffffffc0printf(arr[0] %c,arr[1] %c\n,arr[0],arr[1]);//a,dchar* parr NULL;parr arr;//也可以 parr arr但是编译时会报warningprintf(parr %s, parr %#lx\n, parr,parr);//admin,0x7ffffffc0printf(*(parr) %c,*(parr 1) %c\n,*parr, *(parr1));这里需要注意字符数组末尾需要加‘\0’字符表示字符数组结束或者编译器自己会自动加上所以在定义字符数组长度时需要加1。注意 字符数组名既可以表示地址也可以表示整个字符数组的内容而不是第一个字符。相应的指针也是整个字符数组的内容。12printf(arr %c\n, arr);printf(parr %c\n, parr);以上两行代码可以编译过但是不能显示内容需要用占位符%s去承接整个字符数组内容。字符串型指针字符型指针char* p1234567charstr[5] admin;printf(str %sstr %#lx\n,str,str);// admin,0x7ffffffe0.printf(str[0] %c, str[1] %c\n,str[0],str[1]);// a,dchar* pstr NULL;pstr str;printf(pstr %s, pstr %#lx\n,pstr,pstr);// admin,0x7ffffffe0.printf(*pstr %c,*(pstr1) %c\n,*pstr,*(pstr1));// a,d如代码中结果显示所示字符串数组名即是地址同时也是数组内容根据占位符的不同显示不同内容占位符为%s时显示字符串%#lx显示地址。同样的对于赋值给的指针变量也具有同样的功能。