如何解决指针-意外输出
我正在看书,而这个例子没有正确解释。
据我了解,数组变量(nums
)是指向数组的指针。下一步,我声明一个变量choice
并为其指定数组地址的值。然后,我将choice(我认为是{1、2、3})后面的值传递给数组的最后一个元素。打印我得到的最后一个元素1.为什么会这样?我对指针不了解?
int nums[] = {1,2,3};
int *choice = nums;
nums[2] = *choice;
printf("%i",nums[2]);
解决方法
nums
不是指向数组的指针。 nums
是一个数组,在表达式中使用时,它会转换为指向第一个元素的指针。
因此,当您这样做时:
int *choice = nums;
它使choice
指向nums
的第一个元素。然后,当您使用*choice
时,将获得nums
的第一个元素的值。
据我了解,数组变量(nums)是指向 数组
不,你错了。数组和指针是两种不同的对象。
但是表达式中使用的具有极少数例外的数组会转换为指向其第一个元素的指针。
根据C标准(6.3.2.1左值,数组和函数指示符)
3除非它是sizeof运算符的操作数或一元& 运算符,或者是用于初始化数组的字符串文字, 类型为“类型数组”的表达式将转换为 类型为“要输入的指针”的表达式指向初始 数组对象的元素,不是左值。如果数组对象 具有寄存器存储类,其行为是不确定的。
在此声明中
int nums[] = {1,2,3};
声明了一个包含三个元素的数组。
在此声明中
int *choice = nums;
声明了一个指针,该指针由用作初始值设定项的数组指示符nums
初始化,被隐式转换为指向其第一个(初始)元素的指针。
以上声明实际上等同于以下声明
int *choice = &nums[0];
解引用指针,我们将获得数组的第一个元素(左值)。
因此,这句话
nums[2] = *choice;
等同于
nums[2] = nums[0];
由于nums[0]
(*nums
)等于1,则此调用printf
printf("%i",nums[2]);
将输出值1
。
因为选择和数字是指向数组第一个元素
的指针nums[2] = *choice;
与
相同nums[2] = *(&choice[0]);
,因此与
相同nums[2] = choice[0];
而且,因为你做了
int *choice = nums;
与
相同nums[2] = nums[0];
因此,最后num的值是:
1 2 1
所以nums [2]是1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。