x

指针数组与数组指针

数组指针(指针)

定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

#include <stdio.h>
int main()

{
//一维数组

int a[5] = { 1, 2, 3, 4, 5 };

//步长为5的数组指针,即数组里有5个元素

int (*p)[5];

//把数组a的地址赋给p,则p为数组a的地址,则*p表示数组a本身

p = &a;

//%p输出地址, %d输出十进制

//
回车

//在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型。

printf("%p
", a); //输出数组名,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址

printf("%p
", p); //根据上面,p为数组a的地址,输出数组a的地址

printf("%p
", *p); //*p表示数组a本身,一般用数组的首元素地址来标识一个数组

printf("%p
", &a[0]); //a[0]的地址

printf("%p
", &a[1]); //a[1]的地址

printf("%p
", p[0]); //数组首元素的地址

printf("%d
", **p); //*p为数组a本身,即为数组a首元素地址,则*(*p)为值,当*p为数组首元素地址时,**p表示首元素的值1

printf("%d
", *p[0]); //根据优先级,p[0] 表示首元素地址,则*p[0]表示首元素本身,即首元素的值1

printf("%d
", *p[1]); //为一个绝对值很大的负数,不表示a[1]...表示什么我还不知道




//将二维数组赋给指针

int b[3][4];

int(*pp)[4]; //定义一个数组指针,指向含4个元素的一维数组

pp = b; //将该二维数组的首地址赋给pp,也就是b[0]或&b[0],二维数组中pp=b和pp=&b[0]是等价的

pp++; /=pp+1,该语句执行过后pp的指向从行b[0][]变为了行b[1][],pp=&b[1]


int k;

scanf_s("%d", &k);

return 0;

}

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组(数组)

定义 int p[n];
[]优先级高,先与p结合成为一个数组,再由int
说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:

#include <stdio.h>
int main()
{

int a = 1;
int b = 2;
int *p[2];
p[0] = &a;
p[1] = &b;


printf("%p
", p[0]); //a的地址

printf("%p
", &a); //a的地址

printf("%p
", p[1]); //b的地址

printf("%p
", &b); //b的地址

printf("%d
", *p[0]); //p[0]表示a的地址,则*p[0]表示a的值

printf("%d
", *p[1]); //p[1]表示b的地址,则*p[1]表示b的值


//将二维数组赋给指针数组

int *pp[3]; //一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值

int c[3][4];

for (int i = 0; i<3; i++)

	pp[i] = c[i];


int k;

scanf_s("%d", &k);

return 0;

}

还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:

(p[i]+j)
((p+i)+j)
(
(p+i))[j]、p[i][j]

优先级:()>[]>*

原文地址:https://www.cnblogs.com/surenjiesu/p/10279879.html