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;
}
参考资料:
百度百科——指针数组
#include
void main()
{
int a[100],*p;
int n,t;/*你所要输入数字的个数*/
p=a;
printf("please input number n:");
scanf("%d",&n);
t=n;
while (n--)scanf("%d",p++);/*以此输入要输入的数字*/
p=p-t;
for(int i=0;i<t;i++)
{
if(i%4==0)printf("
");
printf("%d",*(p++));
}
printf("
");
}
运行结果见附图
int **a可以表达一个二维数组。为什么呢?
你可以这么理解 * p[3]表达的是一个数组指针,这个指针 p[0]表示的是数组存的第一个地址。而数组实际上是一串连续地址的块。每一个小块存着一个内容。每次访问数组时,你为什么可以用数组名+下标访问呢? //比如a[i];
实际上就是 访问*a+i; * 这个符号可以表示你存的是变量的地址。而数组地址的第一位为int类型变量存的地址(你可以直接使用数组的地址加上单位变量的空间的大小去访问下个元素)。在这个程序中int *p[3] 表示可以存三个int 类型的地址。而p正好把二维数组的三个一维数组的开头的int类型变量的地址给存起来了。
给你举个例子
我现在输出的是地址,是不是连续的?
用*运算符获取地址的内容。
实际上p[i]与 *(p+i)是表达的是同一个意思。只不过只有数组可以定义一个连续的空间
(数组的第一个地址是随机的其他的是连续的。)单独用指针的话会随机分配的
数组的指针可以存三个地址。当然可以访问二维数组了。
char
*name[4];是一个指针数组,每个成员name[i]都是一个字符指针。
printf函数打印字符串时传的参数就是一个字符指针。
所有printf("%s",
name[4]);
--针对你的问题
printf(“%d”,
name[4]);打印出来的是一个字符串的地址信息。
printf("%d",
*name[4]);打印出来的是name[4]指针所指向的字符对象的值。
P是指针数组,每个指针指向了A的二维起始地址p[i]=a[i];这里是赋值的地址,不是数据。p[0]就是a[0]地址,p[0][0]就是a[0][0]
一维数组a[]:a=a[0]
二维数组a[2][2]的储存原理:
a[]储存各行第一个的地址,,a[0][n]的n为读取地址:a[0]+n*sizeof(int)的值。
*p[]:由于[]的优先级高于*,所以int *p[3]说明p是一个内含三个指针元素的数组,每个元素都指向int的指针。由于程序中p[i]=a[i],所以*p[0]=a[0][0]。(指向各数组的第一个)
p[0]与p[1]有p[0]指向的数组隔开。
而int (*p)[2]是说明p指向一个内含三个int类型值的数组。(这是指向一维数组)
备注是//...或/*...*/
佴雅西博: 应该会有的,这个叫行指针 它指向的数组是有10个元素的数组 int b[10],c[11]; int (*a)[10] = &b;//编译通过 int (*d)[10] = &c;//编译不通过
古塔区17178166003: c语言 用指针实现一组数据的数据输入与输出 - ?
佴雅西博: #include<stdio.h> main() {int a[6],i,*p;for(i=0;i<6;i++) //括号() 数组元素下标0-5 表示六个元素scanf("%d",&a[i]); //加&,这里需要一个指针变量p=a;for(i=0;i<6;i++) //同上printf("%3d",*(p+i) ); //引用指针数据加*,想通过指针访问每个数组元素,需要变化指针地址printf("\n"); }
古塔区17178166003: C语言用指针引用数组元素 - ?
佴雅西博: (*p)[3]是定义一个指向一维数组的指针,数组元素为三.也就是说p指向的其实是a[0],a[1],a[2]这样的形式. p=a;其实就是把第0行的首地址赋值给p. 所以答案C中p[1]即是把第1行的首地址给p,在此基础上向后移一位,取出地址中的元素数值. *(p[1]+1)相当于a[1][1].所以是对的. B的形式是对的,但是它相当于a[2][1],超出界限所以为错.剩下的两个格式就不对.
古塔区17178166003: c语言中如何通过二级指针来操作二维数组 - ?
佴雅西博: 1、首先我们打开电脑里的C语言软件,新建一个工程和.c文件,输入头文件和主函数. 2、然后我们输入图示代码初始化数组,定义变量类型. 3、然后我们输入图示代码用for语句实现数组的访问. 4、然后我们输入图示代码进行输出. 5、然后我们输入图示代码编译、运行,即可通过二级指针来操作二维数组.
古塔区17178166003: C语言 怎么调用指针数组函数?
佴雅西博: #include<stdio.h>#include<string.h> void paixu(char **a) {int i,j;char *p;for(i=0;i<5;i++){for(j=0;j<4-i;j++){if(strcmp(a[j],a[j+1])>0){p=a[j];a[j]=a[j+1];a[j+1]=p;}}} } void main() {char *a[]={"Hongkong","Singgapore","Beijing","...
古塔区17178166003: C语言指针的用法 - ?
佴雅西博: #include<stdio.h> #include<math.h> #include <conio.h> void sort(char *a[],int n) { int i,j; char *temp; for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(strcmp(a[i],a[j]<0)) { temp=a[i]; a[i]=a[j]; a[j]=temp; } }int main() { char *a[3]; int i; for(i=0;i<3;i++) a[i] = (char *)malloc(...
古塔区17178166003: 指针数组函数的用法 - ?
佴雅西博: 请参考: #include <stdio.h>const int fun1(int a,int b) { return a+b; }; const int fun2(int a,int b) { return a-b; };typedef const int (* Fun)(int a,int b); //把 int 返回值 两个int参数的函数定义成Fun函数指针类型int main() { Fun f[2]={fun1,fun2}; //形式相...
古塔区17178166003: C语言中用指针变量指向数组元素 - ?
佴雅西博: 在这里for(p-a;p<(a+10);p++)使用指针 p 以前没有对指针赋值.这样不行.这样指针所指的地址是内存的一个随机地址.在给数组a赋值之前要有“p=a”这样才让指针指向数组的首地址. 而且最后的for(p-a;p<(a+10);p++)中的“p-a”使指针重新指向a 的首地址.p<(a+10)是相当于 P最多可以指向a[9] 的地址. “p++”是让p从a[0]一直上移到p指向a[9]
古塔区17178166003: C语言中的指针数组是什么意思?我对这个概念很混乱,指针数组的定义,作用,使 - ?
佴雅西博: 指针数组:就是存储指针的数组.数组指针:就是指向数组的指针.指针:本质就是一个int型变量,含义:一个内存地址.举例:int *p[10] 指针数组.原因:因为[的优先级比*高,p先和[结合,所以是指针数组.等同于int* p[10].int (*p)[10] 声明了一个指针P,指向有10个元素的数组.如果 int* p;就是声明了一个指向int变量的指针P.同理.int (*p)[10] 声明一个指向int[10]的数组.
古塔区17178166003: C语言怎么用指针代替二维数组 - ?
佴雅西博: 1.设p是指向二维数组a[m][n]的指针变量,则有:int* p=a[0];//此时P是指向一维数组的指针.P++后,p指向 a[0][1].2.如果定义int (*p1)[n];p1=a;p1++后,p1指向a[1][0]; 则p+j将指向a[0]数组中的元素a[0][j].由于a[0]、a[1]┅a[M-1]等各个行数组...