字符串数组名代表什么
#include<stdio.h>intmain(){chara[10];scanf("%s",&a);printf("%x\n",a);printf("%x\n",&a...
#include<stdio.h>
int main()
{
char a[10];
scanf("%s",&a);
printf("%x\n",a);
printf("%x\n",&a);
return 0;
}
为什么结果是一样的? 难道 &a 也代表的是数组第一个字符的地址吗? 展开
int main()
{
char a[10];
scanf("%s",&a);
printf("%x\n",a);
printf("%x\n",&a);
return 0;
}
为什么结果是一样的? 难道 &a 也代表的是数组第一个字符的地址吗? 展开
展开全部
答对了。
其实任何变量的名称代表的都是变量地址,这点学校和教科书不会说的。
举例
int a,b=10;
a=b;
将b赋值给a的操作细节是:
取a和b的地址(直接寻址)
取将b地址中的值
复制保存到a的地址中。
对于普通变量(单个变量),包括指针变量,编译器遇到赋值运算会自动取值,这叫隐式转换。
而对于数组,如果只给出数组名,编译器不会直接取第一个元素,因为它无法确定你要取第几个元素,因此编译器不会自动处理(取值),返回的就是数组名的地址,也就是第一个元素的地址。
而只有当你指定一个索引,才相当于普通变量的取值,而取值过程是:
先取数组地址,在利用索引计算元素位置,然后取值。
因此对于数组a,使用数组名时, int *p=&a 和 int *p=a效果是一样的,前者是显式访问,后者是隐式访问。
C++难,我觉得不仅仅是难在指针上,而是很多隐含的自动转换,因为很多隐式转换不同编译器处理不同,所以让很多初学者很头痛。
其实任何变量的名称代表的都是变量地址,这点学校和教科书不会说的。
举例
int a,b=10;
a=b;
将b赋值给a的操作细节是:
取a和b的地址(直接寻址)
取将b地址中的值
复制保存到a的地址中。
对于普通变量(单个变量),包括指针变量,编译器遇到赋值运算会自动取值,这叫隐式转换。
而对于数组,如果只给出数组名,编译器不会直接取第一个元素,因为它无法确定你要取第几个元素,因此编译器不会自动处理(取值),返回的就是数组名的地址,也就是第一个元素的地址。
而只有当你指定一个索引,才相当于普通变量的取值,而取值过程是:
先取数组地址,在利用索引计算元素位置,然后取值。
因此对于数组a,使用数组名时, int *p=&a 和 int *p=a效果是一样的,前者是显式访问,后者是隐式访问。
C++难,我觉得不仅仅是难在指针上,而是很多隐含的自动转换,因为很多隐式转换不同编译器处理不同,所以让很多初学者很头痛。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询