数组和指针的那点关系
1、数组的各种表示:
对二维数组 int a[3][4],有
a-----二维数组的首地址,即第0行的首地址
a+i-----第i行的首地址
a[i] <=> *(a+i)------第i行第0列的元素地址
a[i]+j <=> *(a+i)+j -----第i行第j列的元素地址
*(a[i]+j) <=> *(*(a+i)+j) Û a[i][j]
a+i=&a[i]=a[i]=*(a+i) =&a[i][0], 值相等,含义不同
a+i <=> &a[i],表示第i行首地址,指向行
a[i] <=> *(a+i) Û &a[i][0],表示第i行第0列元素地址,指向列
2、名词解释:
Int *p[n] n个指向整型数据的指针变量组成的指针数组P,即这个数组中存放的都是指针;
Int (*p)[n] p为指向含有n个元素的一维整型数组的指针变量,即数组指针;
如:char (*ptr)[2];//定义一个含有2个元素的一维char数组的指针变量
ptr = new char[n][2];//声明n个char类型的一维数组(这个数组中有2个元素),其中n为可变,也可不添;
程序举例:
char (*ptr)[2];//
ptr = new char[][2];
ptr[0][0] = 'a';
ptr[0][1] = 'b';
ptr[1][0] = 'c';
ptr[1][1] = 'd';
char *s = ptr[1];
cout << *s << endl;
s++;
cout << *s << endl;
int *p() :P为返回指针的函数,该指针指向一个整型数据,易理解不必多说;
int (*p)():P为指向函数的指针变量,该函数返回整型数据,一看例子便明了了:
int f1()
{
printf("this is f1 /n");
return 0;
}
int f2()
{
printf("this is f2 /n");
eturn 0;
}
int f3()
{
printf("this is f3 /n");
return 0;
}
typedef int (*pFunc)();
pFunc func[3] = {f1,f2,f3};
int main()
{
while (1)
{
printf("please input a number between 1 to 3 /n");
int n = 0;
scanf("%d",&n);
if(n >= 1 && n <=3)
{
func[n-1]();
}
else
{
printf("wrong number !/n");
continue;
}
}
return 0;
}
int **p:P为指针变量,它指向一个指向整型数据的指针变量,即双指针或二级指针;
3、二级指针与指针数组的关系
int **p 与 int *q[10]
– 指针数组名是二级指针常量
– p=q; p+i 是q[i]的地址
– 指针数组作形参,int *q[ ]与int **q完全等价;但作为变量定义两者不同
– 系统只给p分配能保存一个指针值的内存区;而给q分配10块内存区,每块可保存一个指针值