C语言中数组和指针的问题。
有疑问如下:若有int*p,a[3][4];则a[0]a[0][0]a[0][1]a[0][2]a[0][3]a[1]a[1][0]a[1][1]a[1][2]a[1][...
有疑问如下:
若有 int *p,a[3][4];则
a[0] a[0][0] a[0][1] a[0][2] a[0][3]
a[1] a[1][0] a[1][1] a[1][2] a[1][3]
a[2] a[2][0] a[2][1] a[2][2] a[2][3]
则a[0]的地址就是a[0][0]的地址,a[0]是“存在”的且是“指针”且a[0]自己的地址“并不是”a[0][0]的地址,a,a[0]与a[0][0]是占用着3个不同地址的存储单元且a[0]内部装着的是a[0][0]的地址。
a的值与a[0]相同,只是a包含a[0],a[1],a[2]。而a[0]包含a[0][0] a[0][1] a[0][2] a[0][3]
我这样理解是否对呢? 展开
若有 int *p,a[3][4];则
a[0] a[0][0] a[0][1] a[0][2] a[0][3]
a[1] a[1][0] a[1][1] a[1][2] a[1][3]
a[2] a[2][0] a[2][1] a[2][2] a[2][3]
则a[0]的地址就是a[0][0]的地址,a[0]是“存在”的且是“指针”且a[0]自己的地址“并不是”a[0][0]的地址,a,a[0]与a[0][0]是占用着3个不同地址的存储单元且a[0]内部装着的是a[0][0]的地址。
a的值与a[0]相同,只是a包含a[0],a[1],a[2]。而a[0]包含a[0][0] a[0][1] a[0][2] a[0][3]
我这样理解是否对呢? 展开
5个回答
展开全部
不怎么对。
首先,不要理会所谓“常指针”的说法。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];。
首先,不要理会所谓“常指针”的说法。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];。
参考资料: 原创
展开全部
前面的都没什么问题,就是最后“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行元素的地址,这样写可以理解吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
2.A[0]是一个2级常指针,指向一个大小为4的一维数组结构。问题是:中3)所以,int A[2][3][4]={0}; A是一个三维数组,其中A[0]和A[
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
参考资料: 网络
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的理解是错误的,你可以再看一下其他的资料。
追问
为什么呢?您能说说说我的理解是错误的理由么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询