指针数组和数组指针
1)指针数组
先不忙解释含义,类比一下其他的名词。
整型数组:即有一个数组,里面存储的元素类型是整型。 int a[10]
字符数组:定义一个数组,数组元素的数据类型是字符型。 char c[10]
指针数据:定义一个数组,数组元素的数据类型是指针型,指针就是地址。
int *p[10]; //数组p有10个元素,元素类型是指针型,指向整型数的地址。
来看例子:
1 #include "stdafx.h" 2 #include<iostream> 3 #include<stdio.h> 4 void main() 5 { 6 int a=1,b=4,*p[2]={&a,&b}; 7 //p指向p[0],p[0]指向a,则p+1指向p[1],p[1]指向b,即*(p+1)=&b,b=a+b;b=5 8 **(p+1)=a+b; 9 //*p是p[0]是&a,则*(*p+1)=*(&a+1),a的地址的下一个单元,的值是a+b=6,注意此时b 的值已经变为5 10 *(*p+1)=a+b; 11 printf("a的地址是:0x%0x\n",&a); 12 printf("b的地址是:0x%0x\n",&b); 13 //p是数组,所以p[0]和p[1]的地址是连续的,&p[0]是存放a的地址的地址(&&a) 14 //&p[1]是存放b的地址的地址(&&b) 15 printf("p的地址是:0x%0x 0x%0x\n",&p[0],&p[1]); 16 printf("a的下一个单元的地址是:0x%0x\n",&a+1); 17 printf("a的下一个单元的值是:0x%0x\n",*(&a+1));//输出6 18 printf("a=%d,b=%d\n",a,b);//输出1,5 19 system("pause"); 20 }
输出结果:
2) 数组指针
类比整型指针int *p; 定义一个指针变量p指向一个整型数
字符型指针char *c; 定义一个指针变量c指向一个字符型变量
int (*p)[4]; 定义一个指针p指向一个数组,这个数组有4个int型的元素。
下面看例子:
1 #include "stdafx.h" 2 #include<iostream> 3 #include<stdio.h> 4 void main() 5 { 6 int a[3][2]={0},i,j;//定义一个3行2列的2维数组,用数据0来初始化 7 int (*ptr)[2];//定义一个指向有2个int型元素的数组的指针 8 for(i=0;i<3;i++) 9 { 10 ptr=a+i;//ptr指向2维数组的第i行,数组a的每一行有2个元素,类型匹配 11 printf("请输入第%d行的两个元素:",i+1); 12 /*这里要注意,一般scanf时,与%d对应的是地址 13 ptr是指向一个一维数组的,ptr+1就指向了下一个一维数组,地址跳跃8 14 要想取到里面的值,*ptr指向数组的第0个元素,*ptr+1指向数组的第1个元素 15 */ 16 scanf("%d%d",*ptr,*ptr+1); 17 ptr++; 18 } 19 for(i=0;i<3;i++) 20 { for(j=0;j<2;j++) 21 printf("%d ",a[i][j]); 22 printf("\n"); 23 } 24 system("pause"); 25 }
输出结果: