C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组指针’。

作者&投稿:泊婉 (若有异议请与网页底部的电邮联系)

指针数组定义int*p[n];

[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,

这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。

数组指针定义int(*p)[n];

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

如要将二维数组赋给一指针,应这样赋值:

int a[3][4];

int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。

p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

扩展资料:

与数组指针关系

数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。

例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量

与二维数组对比

二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。

指针数组:如char*str_B[5]系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。

如果我做这样的定义:

char a[3][8]={"gain","much","strong"};

char*n[3]={"gain","much","strong"};

他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了

3×8的空间,而给n分配的空间则取决于具体字符串的长度。

此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

举例编辑

数组指针:

#include<stdio.h>

int main()

{

char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一个汉字=3个字节

char(*p)[4];

int i;p=c;//将指针定位于c[0]

for(i=0;i<=5;i++)

{

printf("%s,",*(p+i));//或者将*(p+i)替换成*p++

}

printf("
");

for(i=5;i>=0;i--)

{

printf("%s,",*(p+i));//或者将*(p+i)替换成*--p

}

return 0;

}

指针数组:

#include<stdio.h>

int main()

{

int i;

char*pch[6]={"妹","妹","你","坐","船","头"};

for(i=0;i<6;i++){

printf("%s,",pch<i>);

}

printf("
");

for(i=5;i>=0;i--){

printf("%s
",pch<i>);

}

return 0;

}

参考资料:

百度百科——指针数组




~

C语言中,定义一个int a[3][4],如果定义一个指针指向这个数组呢
答:int a[3][4]的类型是int [3][4],你要定义一个指针指向它,那么首先它得是个指针,int*p,然后指向这个数组,不能写int*p[4]这样写的话p就是个指针数组了,因为p是变量,而[]的优先级要高于*,所以只能写作int(*p)[4];

C语言中如何定义一个行指针
答:int *arry[10]; //指针数组 int (*arryp)[10]; //数组指针,因为数组指针指向数组,而数组也可看做是个指针,那数组指针可以理解为一个二 级指针 int a[10];arryp = &a; //将数组地址个数组指针 arry[0] = *arryp; //arry[0]是一级指针,要将数组指针赋给指针数组,...

有定义:int a[3][10];定义一个指针p,可以赋值:p=a,如何定义该指针?
答:定义如下:int (*p)[10];p = a;注意与int *p[10];的区别:int (*p)[10]; // p是一个指向有10个列的数组的指针,即p是指针,指向含有10个int型列的数组。int *p[10]; // p是一个含有10个int型指针的数组,即p是数组,可以存放10个类型为int*的指针。小技巧:如果指针包含在括号()...

C++中,能否定义一个指针 指向一个 数组指针?如何操作?
答:这就是指针数组的概念:int **p=new int*[5]//定义一个指针p,该指针(二级指针)指向一个包含五个指针元素的数组。接下来在使用的时候,你需要对数组中的每个指针元素继续分配空间。用完之后先释放数组元素中指针的内存空间,然后再释放p所指向的内存空间,可以确保内存无泄漏!忘理解。

C语言编程(用指针) 定义一个数组长度为10,从键盘输入数组,将每一个元素...
答:include <stdio.h> include <stdlib.h> int main(){ int *a;int i;a=(int *)malloc(10*sizeof(int)); //分配内存 for(i=0;i<10;i++){ scanf("%d", (a+i)); //输入第i个单元的值 (a+i)=(*(a+i))/2; //单元值除以2 } for(i=0;i<10;i++){ printf("%4d",*(...

定义一个有10个元素的一维整数数组,定义一个指向一维数组的指针变量
答:1、打开Visual Studio 2010软件,新建一个项目。2、包含程序需要用到的头文件。3、输入主函数main。4、定义一个一维数组。5、定义一个数组指针。6、数组指针指向一维数组。7、打印出结果。

C语言如何定义一个长度为3的函数指针数组?又如何定义一个长度为3的模板...
答:一个长度为3的函数指针数组 void (*a[3])(void);一个长度为3的模板函数指针数组 template<typename T> void (*fun[3])(T t);

定义一个数组a是一个具有3个元素的指针数组,它的定义语句格式是(*a...
答:定义数组a, 所以a本身不是指针,数组元素是指针类型,上图一维指针数组即是。

C语言里怎么在数组里定义汉字变量 和指针指向汉字数组?
答:1、在C语言中,可以通过将汉字作为字符串输入。由于一个汉字占2个字节,所以对汉字的操作,只能以2个字节作为操作单位。2、下面通过具体实例来说明汉字在C语言中的使用:char s[] = "首都北京"; // 将汉字字符赋值给字符数组 char s2[20]; // 定义字符数组,存放用户输入的汉字 scanf("%s...

编程:定义一个长度为5的数组,并给数组赋值,利用指向数组的指针,输出此...
答:printf("数组的元素为:");for (int i = 0; i < 5; i++) { printf("%d ", *ptr);ptr++; // 指针移动到下一个数组元素的地址 } printf("\n");return 0;} 在这个示例代码中,我们定义了一个长度为5的数组 arr,并初始化了它的元素。然后,我们声明了一个指向整数的指针 ptr。接...