问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于C语言中对数组取址的问题,详见补充:

发布网友 发布时间:2022-07-31 10:48

我来回答

5个回答

热心网友 时间:2024-11-26 10:49

对于一个数组来说,数组名是一个地址常量
并不是说是一个地址常量就没有地址(也就是存储常量的存储单元)
当程序没有被调入内存时候,是由三部分代码组成的,依次是二进制代码区(text segment),已经被初始化的静态或者全局变量区(data segment),没有被初始化的静态或者全局变量区(bss segment),常量都是存放在data segment区
当程序被调入内存之后,就在三部分的基础上又被分配了堆区和栈区,栈区用来存放临时变量,参数和返回值等临时的变量
就相当于我们定义char *a="12345",我们都知道这里的“a”是main()中定义的一个指向字符串“12345”的指针,那么“12345”是存放在哪里的呢,就是存放在data segment区的,而“a”变量本身确实存放在程序调入内存后被自动分配的栈区
强制转换的本质上是不改变存储单元中的01代码组合的,只是告诉编译器这个单元的数据将要被作为什么数据处理,例如一个指针变量占据4字节,一个int变量也是四个字节,我们就可以把int强制转换成指针的,需要的时候再把指针转换成int,输出int型结果时是不发生变化的
在这个题目中,“a”是一个数组名,也就是一个地址常量,这个常量存放在data segment区,“&a”取了“a”的地址,也就是一个指向“a”的指针,所以第三个语句是把指向“a”的指针进行了强制转换,第一个语句直接转换的“a”,第二个语句强制转换指向“a[0]”的指针

热心网友 时间:2024-11-26 10:49

数组与指针的问题,必须弄清楚指针的类型这一概念,一维数组int a[5]; 数组名a相当于一个指针,他的类型是“指向int的指针“ ,a与&a[0]是等价的, 而&a; 的类型则是“指向一维数组的指针“,这个一维数组有5个元素,a与&a的地址值是相同的,但他们的类型完全不同,类型决定了再进行计算时进行怎样的操作,比如a+1,指针只偏移1个int大小的单位,但&a+1就会偏移一个含有5个元素的一维数组的单位,也就是偏移5个int这么远。二维数组也是同样的道理,比如int a[3][4]; 其中a与&a[0]相同表示的是一个指针,他的类型是“指向一维数组的指针”这个一维数组有4个元素,同理&a表示的是“指向二维数组的指针”,这个二维数组的形式是[3][4],而a[0]与&a[0][0]相同,表示的是“指向int的指针“,但是,a, &a, a[0]他们的地址是相同的,唯 一区别在于类型不同,类型不对就决定对其指针进行运算时,其计算的方式就会有很大不同。对于数组与指针,指针的类型就显得相当重要,这是一般的教材里面从未提到的。具体更详细的内容请参阅本人所作《C++指针与数组专题》有详细介绍,怎样理解二维及*数组与指针的关系。

热心网友 时间:2024-11-26 10:50

(a) 是一维数组首地址,
(&a[0]) 还是一唯数组首地址 与(a)等价
(&a) 二唯数组首地址,其一唯的宽度就是数组a的元素个数
首地址值是相同的,而你都做了强制转换,所以看不出差别
如果用以下方法,就可以看出差别了
printf("%x ", (void *)(a+1) ); //==&a[1]
printf("%x ", (void *)(&a[0]+1) ); //==&a[1]
printf("%x ", (void *)(&a+1) ); //==&a[sizeof(a)+1]追问你好,再请教一下,我定义的是一维数组,如何理解(&a)变成二唯数组首地址了呢?是编译器的默认处理吗?

追答a本来就只是一个数组的首地址,不是指针变量,但相当于一唯指针,对它取地址,系统会让为是把这个数组整体当一个元素而得到的指针,这指针首地址没变,而做+1等地址运算时,是直接以整个数组为元素向后移指针的,这种行为就说明它是比这个a多一唯层了
应当是编译器处理的规则,,更且体的归纳如下:
int i; i只是一个0唯的(只有一个元素)
int *p=&i; 此时p可以算是比i多一唯层,也就是可以当作一唯数组,指向0唯元素
int **p2 = &p; 看得出p是或相当于一唯数,而&p却是又多一唯层,属于二唯,指向1唯元素
int ***p3 =&p2; 很明显,对二唯指针取地址得到的是三唯的指针....指向二唯元素
......
数组名和指针的区别在于,数组名是const型指针,不能对指针本身赋值,不能改变指针本身
除此之外两者有区别吗,没有,所以,对于 int a[4]; a是一唯的指针(常量), &a当然是成了二唯的指针类型了

热心网友 时间:2024-11-26 10:51

不好意思,刚才回答太轻率了。

请看如下程序:

#include "stdio.h"
void main()
{
int a[4];
//int *p=&a;
int (*q)[4]=&a;
int *s=a;
printf("%d %d\n",a,&a);
}
这个程序可以说明,a是int *类型,而&a是指向int [4]数组的指针。所以a和&a是类型不一样,但值是一样的。

所以,你的问题中,a,&a[0]和&a,虽然类型不完全一样,但就数值来说是一样的,在统一强制类型转换为(INT32U *)后,当然就成一样的了。追问你好,你提到“&a是指向int [4]数组的指针”,我不大理解啊,应该是"&a[0]是指向int [4]数组的指针"才对吧?我的困扰正是在此。

追答a[0]是数组a中的元素,类型是int,取&后的类型当然是一级指针int *
a是长度为4的int数组,&a的类型是指向长度为4的int数组的指针,即int (*)[4]

热心网友 时间:2024-11-26 10:51

[root@localhost test]# gcc -g jh_te.c
[root@localhost test]# ./a.out
a:1234
a---:3212929955
a---:3212929955
b:875770417
c:875770417
[root@localhost test]#
[root@localhost test]#
[root@localhost test]#
[root@localhost test]#
[root@localhost test]#
[root@localhost test]#
[root@localhost test]#
[root@localhost test]# cat jh_te.c
#include<stdio.h>
int main()
{
char a[5]={'1','2','3','4', 0};
printf("a:%s\n", a);
printf("a---:%u\n", &a);
printf("a---:%u\n", a);
int b = *(int *)(&a);
int c = *(int *)(a);
printf("b:%d\n", b);
printf("c:%d\n", c);
}
==========================这是我写的测试代码,看起来的确,a和&a是没区别的。
一下是我的推测:
&这个操作符号的意义是:取地址,但是如果操作的对象本身已经是一个地址变量了,就不会产生作用。
相同的情况也发生在函数名上,
比如:
void func_t();
func_t这个变量其实是一个地址,即函数的入口,看如下代码:
void *p = func_t;
这样我们通过p就能调用func_t这个函数,其实
void *p = &func_t;
也是一个作用,上述两句代码本身没有实质差别。
由此我推测:如果&的操作对象本身已经是一个地址,&就不会再起什么作用了。
=================================================================
再进一步的测试:
假如是char a[4];
&a 和a还是有区别的,但是你这里恶心在a[4]大小是4,如果你改一个别的大小,比如:a[5],最直观的区别就是:
sizeof(&a)=4,sizeof(a)=5.
同时如果你写if(&a == a)这样的代码,(其实他们的值是一样的哦)
编译时会有错误,说这两个量类型不统一。
所以:
a虽然是一个指针,但是还不是最纯粹的指针,它指向数组的首地址的同时,是一个指向特定类型的指针,比如char,就是它的移动单元是以数组大小为单位的,移动单位是1个字节。
&a则是纯粹的指针了,也是指向数组的首地址,但是它的移动单位就是4字节。追问不好意思,再请教一下,定义a[5]的话为什么sizeof(&a)=4?应该也是5了啊。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
粒上皇开口熟栗120g*5袋(共600g)-详细介绍 三皇王板栗介绍 品牌榜:2024年板栗十大品牌排行榜 投票结果公布【新】 为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 哪位大虾给小弟总结一下给字符数组赋值的所有方法,我快被字符数组弄疯... 华为p20为什么拼多多助力转发链接点开不是助力页面? net framework 4.0安装失败 hresult 0xc80001fe 安装NET framework4.0失败,原因是hresult oxc8000222,怎么解决?_百度知... 怎样当明星? C语言的指针表示动态二维数组怎么弄? 文科生可以报考嵌入式系统工程专业吗 课文芦花鞋的线索是芦花鞋那么苏珊的帽子一文的线索是什么请围绕线索分... 苏珊的帽子一文中,描写苏珊心情词语有哪些 苏珊的的帽子概括怎么写? 读了苏珊的帽子这个故事你的收获是什么写一写尽量能用上一两句格言哦... 苏珊的帽子这一课你有什么感受能用一两句格言警句来揭示文章的... 苏珊的帽子,读了这个故事,你有什么感受,你能用一两,句警,格言警句来揭... 读了苏珊的帽子你有什么感受能用一至二句名言说说吗 读了《苏珊的帽子》一文,有什么收获,用上一句名言? 兄弟传真机7380比7360好在哪里 兄弟FAX-738MC传真机怎么不复印了? 熟睡宝跟宜家区别 熟睡宝电蚊香液怎么样? 熟睡宝电蚊香算是比较好的一个品牌了吗? 请问PLC编程都支持内嵌C语言模块是什么意思?有什么用? 谁有C语言程序设计潭浩强(第三版)第二章答案? ph计 贵不贵,一般卖多钱? 常用的pH计大约得多少钱 梅特勒 托利多 ph计多少钱 义乌市有几个乡镇每个叫什么名字 求C语言程序设计(谭浩强)(第三版)课后题答案 ph计多钱能买到 养鱼测量水的PH值的仪器市场有卖吗?如果有大概什么价格? 求c语言程序设计 谭浩强 第三版的课后习题答案 养鱼 尤其是 魟鱼 PH仪 是不是必须的 如果是必须的 请给推荐一个实用... 如何创建不用手机号? 无需手机号怎么注册? iphonexsEBT价格 什么是JDC? 我删了曾经在乎的人,他现在又密密加回来,我该怎么办好 mc应该如何喊?怎样能学好mc,喊mc需要什么? 怎样学习MC? 包头初中排名?老弟要升初中了,所以想了解一下,谢谢 c语言中的char c1=&#39;6&#39;单引号加数字是什么意思啊?