C语言中:数组指针与指针数组有什么区别?
数组指针是指向这个数组首地址的指针,指向对象是这个数组;
指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;
例子:
int
a[10];
int*
s;
s
=
a;//这里s就是一个数组指针,它的值就是数组a
的首地址;当然,如果a是一个整数,那s就是一个指向整型的指针;
int
a;
int*
s[5];
for(int
i=0;i<5;i++)s[i]=a;
//这里s就是一个指针数组,它的每个元素都是整型变量a的地址
指针数组定义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;
}
参考资料:
百度百科——指针数组
指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;
例子:
int a[10];
int* s;
s = a;//这里s就是一个数组指针,它的值就是数组a 的首地址;当然,如果a是一个整数,那s就是一个指向整型的指针;
int a;
int* s[5];
for(int i=0;i<5;i++)s[i]=a;
//这里s就是一个指针数组,它的每个元素都是整型变量a的地址
应该算比较明白了吧
谢楼上提醒
你们最好把我下面写的看10分钟以上,我刚才从百度上搜集资料感觉不太靠谱,然后去一下专业的网站查阅了一些文章,在自己电脑上测试了快一个小时了才搞的差不多了,我下面说说。到最后如果还没听懂的,文末有我之前读过的一篇文章,大家可以去看看例子。
1.大概说一下这三种
int * a; 这叫整型指针 这玩意儿不能指向数组,搞清楚指向的是数组首元素
int (* b)[]; 这叫整型数组指针 意思是指向数组的指针
int * c[5]=NULL; 这叫整型指针数组 意思是储存指针的数组
下来举个例子,理解一下:
2.定义一个数组,下面举例解释
int i[5]={0}; //定义整型数组,五元素皆为0
int n[5][5]={0}; //定义二维数组
3.三种分别举例
(a的例子)
a=i; //这里i是数组名,i相当于&i[0]。数组名相当于是数组i的首地址。此时* a指向数组i首元素。
a++;然后输出就是i[1]的值
(b的例子)
b=n; //二维数组名相当于n[5]这个数组,注意这块儿,这块儿最难搞清楚。n代表的不是第一行第一个元素的地址,而是代表第一行元素的所有地址的数组。这块的指针数组b相当于存放了n数组第一行的所有元素的地址。
//这块的数组指针b和上面的指针a比较,a指向的是数组的首元素,而b指向的是整个数组(或者说是存放了整个一维数组的多个元素(二维数组由一维数组构成,二维数组的第一行即是一个一位数组))
然后我们输出(* b)[2]相当于输出了n[0][2]
如果b++然后输出(* b)[2]相当于输出了n[1][2]
c的玩法:
太简单了,不想说了。就是存放多个指针的数组,自己想想。
参考文章:网页链接
int (*p)[4]; // 定义一个数组指针,指向含4个元素的一维数组,数组元素是int类型。
int *p[4]; // 定义一个指针数组,数组中每个元素是一个指针,指针指向哪里就要根据程序来定了。
判断数组指针与指针数组主要通过运算符的优先级来判断。
int (*p)[4]; // 由于( )的优先级高,说明p是一个指针,指向一个一维数组的指针
int *p[4]; // 由于[ ]的优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组
搂主先要明确每个词的后面一个名词代表其所要定义的类型
数组指针就是指向一个数组首地址的指针(aa);
举例:
char a[]="Hello World";
char *aa;
aa=a;
指针数组就是一个数组,这个数组的元素是指针;
举例:
char a='t';
char *aa[2];
a[0]=a;
a[1]=a;
附:感觉楼上的这段举例有点问题
int a[10];
int* s;
s = &a;
c语言数组不可以当成指针使用,但是指针可以当成数组使用吗?
可以 1.指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。2.数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。3.核心思想是通过...
C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组...
指针数组定义int*p[n];[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来...
c语言指针,指向数组的指针、指向指针数组的指针、指向数组的指针的指...
每个元素是int,不是int (*p)[n],而是最简单的int*p;2. 如何声明一个指针,这个指针也是指向数组的,数组有n个元素,每个元素不是int,而是指针int*;这个指针是int**p;3. 又如何声明一个指针,它指向另一个指针,这“另一个指针”指向一个数组,数组元素是int;这个指针仍然是int**p。
C语言的数组和指针问题,谢谢高手的解答!
总结,问题的关键在于,数组名相当于一个指向于这个数组第一个元素的指针。3)所以,int A[2][3][4]={0};A是一个三维数组,其中A[0]和A[1]都是它的元素,A[0]是第一个元素。所以, A是一个三级指针,指向了这个数组的第一个元素A[0],而A[0]是一3*4的二维数组。而A[0]是一个...
指针数组和数组指针的区别有哪些?
指针数组:表示的是一个数组,数组中每一个变量都是指针型变量。数组指针:表示的是一个指针类型的变量,这个指针变量指向的是一个数组。
C语言中数组和指针的关联是什么?
是地址 指针指向一个地址,而数组名也是表示数组队首地址
C语言中数组和指针的问题。
先考虑LZ最后的表述。注意C语言中对象可以理解为被占据的连续的内存。值是对象的内容,包含类型和实际的存储表示(对整数类型就是数值,对指针类型一般实现为平坦地址空间元素的整数)。数组对象a的类型是int[3][4],即元素类型为int[4]、具有3个元素的数组类型;a[0]是它的元素,也是数组对象——...
C语言中 *与& 在指针及数组中的含义 望详细具体
举个例子 一个整数int a = 2;比如你再定义一个指针int *p = &a;此时p就是a的地址,就是&a p就是取p地址上的值,就是a 数组也是一样的 只不过数组名表示一个数的地址而已~举个例子 有个数组a[10]a[0]存放在地址为1000的地址位上 那么a就等于1000 因为在数组中a就等价于&a[0],即...
C中数组和指针到底是否相同?
C语言标准对此作了说明:规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针; 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&取数组的地址规则2:下标总是与指针的偏移量相同;规则3:在函数参数的声明中,数组名被编译器当做指向该数组第一个元素的指针。 规则1和规则2结合在一起理解...
新手求教关于C语言的数组与指针问题!求高手!
你的疑问非常有理!这题就是胡扯谈,A还能占上边,其它全不占边。题目是“指向数组指针pt的是”——这话都没说清楚,这选项中哪有“指向指针pt”的标识符?可能是想说“指向数组的指针pt是”,那就是A了……B——把数组pt的下标为5的元素强制为int *型指针,这错得太多。C——声明pt是有5个...
主父烟二维: 数组指针是指向这个数组首地址的指针,指向对象是这个数组;指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;例子:int a[10]; int* s; s = a;//这里s就是一个数组指针,它的值就是数组a 的首地址;当然,如果a是一个整数,那s就是一个指向整型的指针;int a; int* s[5]; for(int i=0;i<5;i++)s[i]=a;//这里s就是一个指针数组,它的每个元素都是整型变量a的地址 应该算比较明白了吧 谢楼上提醒
玄武区15567228903: C语言中的指针数组是什么意思?我对这个概念很混乱,指针数组的定义,作用,使 - ?
主父烟二维: 指针数组:就是存储指针的数组.数组指针:就是指向数组的指针.指针:本质就是一个int型变量,含义:一个内存地址.举例:int *p[10] 指针数组.原因:因为[的优先级比*高,p先和[结合,所以是指针数组.等同于int* p[10].int (*p)[10] 声明了一个指针P,指向有10个元素的数组.如果 int* p;就是声明了一个指向int变量的指针P.同理.int (*p)[10] 声明一个指向int[10]的数组.
玄武区15567228903: 数组指针和指针数组的区别 - ?
主父烟二维: 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应...
玄武区15567228903: 数组指针,指针数组区别!要详细,超详细!我区分了好多次了,还是不清楚啊 - ?
主父烟二维: 1、在c和c++中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示).2、指针数组是指一个数组中的每个元素都是一个指针,也就是多维数组.说白了,数组指...
玄武区15567228903: C语言数组下标和指针的关系 - ?
主父烟二维: 数组和指针的区别: 数组名确实表示指向数组首地址的指针,但这个指针很特别,它的值(指针的值指的是指针所指的地址)不能被改写,能改写的仅仅是其指向的内容,换句话说,数组名只能指向数组的首地址,如果有数组char a[];那么如...
玄武区15567228903: 关于C语言数组指针的应用 - ?
主父烟二维: 应该会有的,这个叫行指针 它指向的数组是有10个元素的数组 int b[10],c[11]; int (*a)[10] = &b;//编译通过 int (*d)[10] = &c;//编译不通过
玄武区15567228903: C语言中,指针和数组的区别和联系? - ?
主父烟二维: 区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针.所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以...
玄武区15567228903: c语言中指针数组与数组指针?
主父烟二维: 区别在于类型不同. int (*p)[4]:定义数组保存int类型的数据. int* p[4]:定义数组保存int*类型的数据. int (*p)[4]中(*p)声明p为指针,本例中p将代替一个数组成为一个数组指针. int* p[4]中int*声明了数组只能存放整形指针类型的数据,因此这个数组为指针数组.
玄武区15567228903: C语言 指针数组与数组指针?
主父烟二维: 指针数组,就是一个数组里存放的都是指针,比如*p[8];p[0]里存放的就是一个指针数据 数组指针,数组名就是一个指向数组起始地址的指针,数组下标是萦引,比如num[0],他就相当于num+0; num这个指针没移动,于是取的是数组的第一个.num[1]相当于数组指针移1,于是指向数组第二个
玄武区15567228903: C语言中指针数组是什么意思? - ?
主父烟二维: int *p[n];-----指针数组,每个元素均为指向整型数据的指针. int (*)p[n];------p为指向一维数组的指针,这个一维数组有n个整型数据. int *p();----------函数带回指针,指针指向返回的值. int (*)p();------p为指向函数的指针.