c语言指针中,一维指针比较容易懂,但是遇到二维指针,有时侯就会不知道怎么给指针赋值了。
1、一维指针
通常是用来指向“数据块”的某个存储单元,它的值就是“那个存储单元的地址”。
特点:直接指向存储单元。
如:
char MyArray[5];
char *p1; //声明一维指针变量p1
p1=&MyArray[4];
//使用p1指针指向"MyArray[4]"
//这样“p1的值”等于“MyArray[4]的地址”,而一维指针变量p1的地址是由系统分配的。
printf("MyArray[4] =%d\r\n",*p1); //打印"所指向的数据值"
printf("p1 =0x%p\r\n",p1); //打印p1的值
printf("The address of p1 =0x%p\r\n",&p1); //打印“指针变量p1”的地址
2、二维指针
二维指针通常是用来指向“一维指针的地址”,间接指向数据块的某个存储单元。这个“一维指针的地址”就是这个二维指针的值,“这个二维指针变量的地址”是由系统分配的;
特点:间接指向存储单元。
char MyArray[5];
char *p1; //声明一维指针变量p1
char **p2; //声明二维指针变量p2
p1=&MyArray[4]; //使用p1指针指向"MyArray[4]"
p2=&p1; //将p1指针变量的地址保存到p2中
printf("MyArray[4] =%d\r\n",*p1); //打印"p1所指向的数据值"
printf("MyArray[4] =%d\r\n",**p2); //打印"p2所指向的数据值"
printf("p1 =0x%p\r\n",p1); //打印p1的值,即"MyArray[4]"的地址
printf("*p2 = 0x%p\r\n",*p2);//打印p2的"指针值",即"MyArray[4]"的地址
printf("The address of p1 =0x%p\r\n",&p1); //打印“指针变量p1”的地址
printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值,即"指针变量p1"的地址
3、三维指针
三维指针通常是用来指向“二维指针的地址”。
特点:间接一次后,再间接指向存储单元。
char MyArray[5];
char *p1; //声明一维指针变量p1
char **p2; //声明二维指针变量p2
char ***p3; //声明三维指针变量p3
p1=&MyArray[4]; //使用p1指针指向"MyArray[4]"
p2=&p1; //将p1指针变量的地址保存到p2中
p3=&p2; //将p2指针变量的地址保存到p3中
printf("MyArray[4] =%d\r\n",*p1); //打印"p1所指向的数据值"
printf("MyArray[4] =%d\r\n",**p2); //打印"p2所指向的数据值"
printf("MyArray[4] =%d\r\n",***p3); //打印"p3所指向的数据值"
printf("p1 = 0x%p\r\n",p1);//打印p1的值
printf("*p2 = 0x%p\r\n",*p2);//打印*p2"的值"
printf("**p3 = 0x%p\r\n\r\n",**p3);//打印**p3"的值"
4、测试程序
#include
//函数功能:打印数组数据
void Print_MyArray(int *array, int size)
{
int i;
//打印数组开始/
for(i=0;i { printf("MyArray[%d]=%d",i,array[i]); if(i!=4) printf(", "); else printf("\r\n"); } //打印数组结束/ } //c语言一维数组,二级指针和三级指针 int main(int argc,char *argv[]) { int i; int MyArray[5]; int *p1; int **p2; // int **p2=&p1;//在声明变量时,可以这么赋值 int ***p3; for(i=0;i<5;i++)//修改数组中的数据 { MyArray[i]=i+1; } Print_MyArray(MyArray,5);//打印数组数据 p1=MyArray; for(i=0;i<5;i++)//修改数组中的数据 { *p1=*p1+1;//修改数组的值 p1++; //这里是修改p1的值,但指针变量p1的地址是保持不变的 } Print_MyArray(MyArray,5);//打印数组数据 p1=MyArray;//使用p1指针指向"MyArray[]" p2=&p1;//将p1指针变量的地址保存到p2中 for(i=0;i<5;i++)//修改数组中的数据 { **p2=**p2+1;//"**p2"是"*p2"指向的存储数据 (*p2)++; //这里需要用小括号 //这里是修改p1的值,但指针变量p1和p2的地址是保持不变的 } Print_MyArray(MyArray,5);//打印数组数据 p1=MyArray;//使用p1指针指向"MyArray[]" p2=&p1;//将p1指针变量的地址保存到p2中 p3=&p2;//将p2指针变量的地址保存到p3中 for(i=0;i<5;i++)//修改数组中的数据 { ***p3=***p3+1;//"***p3"是"**p3"指向的存储数据 (**p3)++; //这里需要用小括号 //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的 } Print_MyArray(MyArray,5);//打印数组数据 p1=&MyArray[4];//使用p1指针指向"MyArray[4]" p2=&p1;//将p1指针变量的地址保存到p2中 p3=&p2;//将p2指针变量的地址保存到p3中 printf("*p1 =%d\r\n",*p1); printf("**p2=%d\r\n",**p2); printf("***p3=%d\r\n\r\n",***p3); printf("The first address of MyArray[] =0x%p\r\n",MyArray); printf("p1 = 0x%p\r\n",p1);//打印p1的值 printf("*p2 = 0x%p\r\n",*p2);//打印p2的"指针值" printf("**p3 = 0x%p\r\n\r\n",**p3);//打印p3的"指针值" printf("The address of p1 is 0x%p\r\n",&p1);//打印"指针变量p1"的地址 printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值 printf("The address of p2 is 0x%p\r\n",&p2);//打印"指针变量p2"的地址 printf("The value of p3 is = 0x%p\r\n\r\n",p3);//打印p3的值 return 0; } 5、程序运行结果: 6、总结 一维指针可以直接指向某个存储单元; 二维指针必须通过一维指针这个桥梁,才可以到达指向某个存储区;因此,只能间接指向某个存储单元。 三维指针,必须经过二维指针和一维指针,也是通过桥梁的方式,才可以访问某个存单元。 p1=MyArray;//使用p1指针指向"MyArray[]" p2=&p1;//将p1指针变量的地址保存到p2中 p3=&p2;//将p2指针变量的地址保存到p3中 for(i=0;i<5;i++) { printf("p1 = 0x%p\r\n",p1);//打印p1的值 printf("*p2 = 0x%p\r\n",*p2);//打印"p2指向p1的值" printf("**p3 = 0x%p\r\n",**p3);//打印"p3指向p1的值" printf("&p1 = 0x%p\r\n",&p1);//打印p1的地址 printf("p2 = 0x%p\r\n",p2);//打印p2的值,即p1的地址 printf("*p3 = 0x%p\r\n",*p3);//打印"p3指向p1的地址" printf("&p2 = 0x%p\r\n",&p2);//打印p2的地址 printf("p3 = 0x%p\r\n\r\n",p3);//打印p3的值,即p2的地址 (**p3)++;//这里需要用小括号,读取p1的值,然后修改p1的值 //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的 }#include