在 C 语言中 “指针和数组等价” 到底是什么意思?

作者&投稿:泊通 (若有异议请与网页底部的电邮联系)
c语言中的指针数组和数组指针的区别~

int (*p)[4]; // 定义一个数组指针,指向含4个元素的一维数组,数组元素是int类型。
int *p[4]; // 定义一个指针数组,数组中每个元素是一个指针,指针指向哪里就要根据程序来定了。

判断数组指针与指针数组主要通过运算符的优先级来判断。
int (*p)[4]; // 由于( )的优先级高,说明p是一个指针,指向一个一维数组的指针
int *p[4]; // 由于[ ]的优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组

你不会是想打s=s+t吧?
如果是的话s=s+t等价于s+=t

在 C 语言中对数组和指针的困惑多数都来自这句话。说数组和指针 “等价”
不表示它们相同, 甚至也不能互换。它的意思是说数组和指针的算法定义可以用指针方便的访问数组或者模拟数组。
特别地, 等价的基础来自这个关键定义:
一个 T 的数组类型的左值如果出现在表达式中会蜕变为一个指向数
组第一个成员的指针(除了三种例外情况); 结果指针的类型是 T 的
指针。
这就是说, 一旦数组出现在表达式中, 编译器会隐式地生成一个指向数组第一个成员地指针, 就像程序员写出了 &a[0] 一样。例外的情况是, 数组为 sizeof 或 &操作符的操作数, 或者为字符数组的字符串初始值。
作为这个这个定义的后果, 编译器并那么不严格区分数组下标操作符和指针。在形如 a[i] 的表达式中, 根据上边的规则, 数组蜕化为指针然后按照指针变量的方式如 p[i] 那样寻址, 如问题 6.2 所述, 尽管最终的内存访问并不一样。如果把数组地址赋给指针:
p = a;
那么 p[3] 和 a[3] 将会访问同样的成员。


盱眙县17111591633: 在 C 语言中 ``指针和数组等价" 到底是什么意思 ? -
长孙庄琥珀: 在C语言中对数组和指针的困惑多数都来自这句话.说数组和指针 ``等价" 不表示它们相同, 甚至也不能互换.它的意思是说数组和指针的算法定义可以用指针...

盱眙县17111591633: 6.3 那么C语言的“指针和数组等价”是什么意思 -
长孙庄琥珀: 指的是一维指针 和一维数组 在访问上可以等价 换句话说 就是一维数组的数组名 等效于指针常量 int a[10], *p=a; 那么 p[3] a[3] *(p+3) *(a+3) 这四个 等效.

盱眙县17111591633: C语言:通过指针引用多维数组一节中,二维数组a[0]和*(a+0)等价,怎么理解? -
长孙庄琥珀: 理解这个问题的要点是: 二维数组是 元素为一维数组的一维数组.于是 a[0]是作为二维数组首元素的一维数组名,所以a[0]表示一维数组(实际是二维数组首行)首元素的地址,即,a[0]是a[0][0]的地址;数组名a是指针,指向其首元素(a[0]),即其值为&a[0](&a[0]指向a[0][0]),所以*(a)(即*(a+0))指向指向a[0][0];所以,a[0]与*(a+0)等价,都是指向a[0][0].不知这样说能不能理解.

盱眙县17111591633: 指针与数组的区别和联系 -
长孙庄琥珀: 区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针.所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以...

盱眙县17111591633: 数组变量和指针的区别 -
长孙庄琥珀: C语言中,数组的名称等价于数组的首地址, 当然可以利用指针开辟动态空间,使用方式与数组在形式上相同的, 但是他们有一个本质的区别,数组名相当于一个地址常数,而指针是一个以地址为内容的变量.

盱眙县17111591633: c语言数组不可以当成指针使用,但是指针可以当成数组使用 -
长孙庄琥珀: 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称. 数组指针:首先它是一个指针,它指向一个数组.在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,...

盱眙县17111591633: 我一直以为数组和指针是一回事.数组就是静态的指针.但是看了c专家编程他说数组和指针不是一回事.求解释!? -
长孙庄琥珀: C++/C程序中,指针和数组在不少地方都是可以相互替换使用的,这就让人产生一种错觉,以为两者是等价的. 数组或是在静态存储区被创建(全局数组),或是在栈上被创建.数组名对应着,注意不是指向,一块内存,其地址与容量在生命期...

盱眙县17111591633: C语言传字符串数组 -
长孙庄琥珀: char *strings[16]; 这是一个指针数组,直接定义一个数组就可以了,对字符串的操作,指针和数组是等价的,如果像你这样用就这样改:char **str; *str=strings[i]; 或者 char *str; str=&strings[i];

盱眙县17111591633: c语言指针与数组,怎么联系起来? -
长孙庄琥珀: 数组就是指针常量,在不涉及到修改指针变身的值的情况下,两者可以通用....

盱眙县17111591633: C语言,这两个是否等价
长孙庄琥珀: 这两个是不等价的,char ss[] = "abcd\n"是一个字符数组ss是这个数组的起始地址,而char *ss = "abcd\n"则是一个以ss开始的字符串,系统会自动在字符串的结尾为字符串加上'\0',也就是说char *ss = "abcd\n"在内存中比char ss[] = "abcd\n"多一个'\0'

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网