C语言中数组和指针的问题。
发布网友
发布时间:2023-07-19 20:33
我来回答
共5个回答
热心网友
时间:2024-10-31 03:44
不怎么对。
首先,不要理会所谓“常指针”的说法。C语言中“常量”有特殊的含义——某些种类的字面量(如类型为int的整数常量);有时也指const限定符;但并不见得和字面上的“不可改变”的“常量”同义(例如const对象事实上是只读对象而不是真正意义上的常量,通过显式转换指针类型可以修改并引起不可预料的后果),滥用这个概念这只会使所要讨论的问题更容易被混淆。另外,建议LZ系统地复习至少这些基本概念:对象、左值、类型和值,如果看不懂以下内容的话。
数组是数组,指针是指针。a是a,a[0]是a[0]。只不过在作为sizeof、&的操作数等有限几个左值上下文之外的场合数组a会退化(隐式转换,结果的类型是元素的指针类型,丢弃了数组类型中的长度)成指向首个元素的指针&a[0],所以容易造成误解。
先考虑LZ最后的表述。
注意C语言中对象可以理解为被占据的连续的内存。值是对象的内容,包含类型和实际的存储表示(对整数类型就是数值,对指针类型一般实现为平坦地址空间元素的整数)。数组对象a的类型是int[3][4],即元素类型为int[4]、具有3个元素的数组类型;a[0]是它的元素,也是数组对象——类型是int[4]。显然类型不同,所以值不同。
a包含a[0],a[1],a[2]。而a[0]包含a[0][0] a[0][1] a[0][2] a[0][3]——正确。
再考虑:LZ之前的陈述。
对象的地址是运行期对象占据的连续内存的首个内存单元(字节)在地址空间的编号。“a,a[0]与a[0][0]是占用着3个不同地址的存储单元”是错的,因为根本就不能确定每个对象只占据一个地址单元。考虑一般实现的内存布局,a、a[0]、a[0][0]的指针&a、&a[0]、&a[0][0]具有不同的值(类型不同),但在存储的数值上相等。注意表达式&a不是左值,不指称一个具有存储的对象——事实上这个表达式的值在编译期即可确定。因此这些指针的值编译器当然知道,但不会在运行期被存储在以上对象内部。当然用一个指针变量在运行期保存这个值是可行的,例如p=&a[0];printf("%p",p);直接使用这个值printf("%p",&a[0]);同义。
a[0]是一个类型为int[4]的数组,是a的第一个元素,它的地址蕴涵于指针&a[0]中。注意&a[0]刚好能通过非左值上下文的作为表达式的a转换得到。 形如p=a;的用法,实际上就是p=&a[0];。
参考资料:原创
热心网友
时间:2024-10-31 03:44
前面的都没什么问题,就是最后“a的值与a[0]相同,知识a包含a[o],a[1],a[2]。而a[0]包含a[0][0] a[0][1] a[0][2] a[0][3]"是错的,这句根本就不成立。追问为什么呢?
追答举个例子吧!int array[2][3]={{1,2,3},{4,5,6}};表示形式array含义为0行元素的地址,这样写可以理解吗?
热心网友
时间:2024-10-31 03:44
2.A[0]是一个2级常指针,指向一个大小为4的一维数组结构。问题是:中3)所以,int A[2][3][4]={0}; A是一个三维数组,其中A[0]和A[
热心网友
时间:2024-10-31 03:45
你可以去看这篇文章,
http://book.51cto.com/art/201103/248068.htm
兴许能对你有所帮助。
参考资料:网络
热心网友
时间:2024-10-31 03:46
你的理解是错误的,你可以再看一下其他的资料。追问为什么呢?您能说说说我的理解是错误的理由么?