浅析C语言变量名的问题
2017-03-05 17:27
183 查看
1、先来探讨普通变量名问题
inta = 0;
charb = ‘c’;
printf(“a=
%d\n”,a); //0
Printf(“b=
%c\n”,b); //c 没有必要有图片吧
可以看出,变量名a和b输出为相应存在各自内部空间的数据。
那么是不是可以假设,知道内存空间的名字,也就是a和b,就可以输出相应内存空间的数据
2、 再来探讨指针变量名
int *a =NULL;
char *b =NULL;
int a1 = 0;
char b1 = ‘c’;
a =&a1;
b =&b1;
printf("a =%d\n",a);
printf("&a1= %d\n",&a1);
printf("*a =%d\n",*a);
printf("b=%d\n",b);
printf("&b1=%d\n",&b1);
printf("*b =%c\n",*b);
通过上述输出,可以假设,指针变量名存储的就是相应的地址,再大胆一点,指针变量名表示的是所要存储的地址
3、再来探讨一维数组的数组名
int a[] ={1,2,6,9,5};
printf(“a=
%d\n”,a);//数组首元素地址
printf(“&a=
%d\n”,&a); //数组首地址 数据类型本质不同
printf(“a[0]=
%d\n”,a[0]);
printf(“&a[0]=
%d\n”,&a[0]);//和a、&a比较输出
printf(“a+1=
%d\n”,a+1);//数组首元素地址+1
printf(“&a+1=%d\n”,&a+1);
//数组首地址+1
printf(“a =
%d\n”,a);
printf(“*(a+1)=
%d\n”,*(a+1));//比较和a、&a输出
假设数组名代表的是数组首元素地址
基于上述测试,那么我们是不是可以做出这样一个假设,其实
变量名在不同的场景有不同的应用。如下:
1、当变量名被常量(常量就是不可悲在被改变的量,”abcdef”,12等)被赋值时,变量名就是这个内存空间的别名,那么这个变量表示存储在内存空间的数据。
inta = 12;
charc = “ancdef”;
printf(“a=
%d\nc = %s\n”, a,c);
2、当变量名作为指针变量名使用时,那么这个变量名表示存储在内存空间的地址。
char*p = "abcdef";
printf("sizeof(*p):%d\n",sizeof(*p));
printf("p:%s\n",p);
printf("&p:%d\n",&p);
printf("p:%d\n",p);
printf("&p[0]:%d\n",&p[0]);
printf("*p:%c\n",*p);
3、当变量名作为数组名使用时,当做指向数组第一个元素的指针,也就是说这时候变量名表示的是数组首元素的地址。
拓展一下,这个时候的数组名可以当做指针使用,但是数组名不是指针,而是一个指针常量(指向元素的地址不可在被改变)。当sizeof(数组名),这个时候的数组名代表指向数组的指针。
4、那么结构体呢,变量名和作为指针变量名其实和上面分析是一样的,变量名作为结构体的内存空间表示
变量名.成员变量 表示结构体变量选择了结构体成员变量
(点操作符运算顺序是从左往右)
指针变量->成员变量 表示对左操作数执行间接访问取得指针所指向的结构体,然后和点操作符一样,选择成员变量
(箭头运算符运算顺序是从左往右)
其实以上的分析并不能算是从根本上解决问题,只是说在平
常使用时可以炉火纯青,不会出太大的错误,但是若是想真正
搞懂变量名代表着什么,需要自己些一款GCC,才能够真正理
解变量名在不同场景的运用。
inta = 0;
charb = ‘c’;
printf(“a=
%d\n”,a); //0
Printf(“b=
%c\n”,b); //c 没有必要有图片吧
可以看出,变量名a和b输出为相应存在各自内部空间的数据。
那么是不是可以假设,知道内存空间的名字,也就是a和b,就可以输出相应内存空间的数据
2、 再来探讨指针变量名
int *a =NULL;
char *b =NULL;
int a1 = 0;
char b1 = ‘c’;
a =&a1;
b =&b1;
printf("a =%d\n",a);
printf("&a1= %d\n",&a1);
printf("*a =%d\n",*a);
printf("b=%d\n",b);
printf("&b1=%d\n",&b1);
printf("*b =%c\n",*b);
通过上述输出,可以假设,指针变量名存储的就是相应的地址,再大胆一点,指针变量名表示的是所要存储的地址
3、再来探讨一维数组的数组名
int a[] ={1,2,6,9,5};
printf(“a=
%d\n”,a);//数组首元素地址
printf(“&a=
%d\n”,&a); //数组首地址 数据类型本质不同
printf(“a[0]=
%d\n”,a[0]);
printf(“&a[0]=
%d\n”,&a[0]);//和a、&a比较输出
printf(“a+1=
%d\n”,a+1);//数组首元素地址+1
printf(“&a+1=%d\n”,&a+1);
//数组首地址+1
printf(“a =
%d\n”,a);
printf(“*(a+1)=
%d\n”,*(a+1));//比较和a、&a输出
假设数组名代表的是数组首元素地址
基于上述测试,那么我们是不是可以做出这样一个假设,其实
变量名在不同的场景有不同的应用。如下:
1、当变量名被常量(常量就是不可悲在被改变的量,”abcdef”,12等)被赋值时,变量名就是这个内存空间的别名,那么这个变量表示存储在内存空间的数据。
inta = 12;
charc = “ancdef”;
printf(“a=
%d\nc = %s\n”, a,c);
2、当变量名作为指针变量名使用时,那么这个变量名表示存储在内存空间的地址。
char*p = "abcdef";
printf("sizeof(*p):%d\n",sizeof(*p));
printf("p:%s\n",p);
printf("&p:%d\n",&p);
printf("p:%d\n",p);
printf("&p[0]:%d\n",&p[0]);
printf("*p:%c\n",*p);
3、当变量名作为数组名使用时,当做指向数组第一个元素的指针,也就是说这时候变量名表示的是数组首元素的地址。
拓展一下,这个时候的数组名可以当做指针使用,但是数组名不是指针,而是一个指针常量(指向元素的地址不可在被改变)。当sizeof(数组名),这个时候的数组名代表指向数组的指针。
4、那么结构体呢,变量名和作为指针变量名其实和上面分析是一样的,变量名作为结构体的内存空间表示
变量名.成员变量 表示结构体变量选择了结构体成员变量
(点操作符运算顺序是从左往右)
指针变量->成员变量 表示对左操作数执行间接访问取得指针所指向的结构体,然后和点操作符一样,选择成员变量
(箭头运算符运算顺序是从左往右)
其实以上的分析并不能算是从根本上解决问题,只是说在平
常使用时可以炉火纯青,不会出太大的错误,但是若是想真正
搞懂变量名代表着什么,需要自己些一款GCC,才能够真正理
解变量名在不同场景的运用。
相关文章推荐
- c语言全局变量和局部变量问题汇总
- c语言全局变量和局部变量问题汇总
- 关于c语言中变量赋值问题
- c语言全局变量和局部变量问题及解决汇总
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- 弄清C语言中的变量未赋值时的初始值问题
- c语言全局变量和局部变量问题汇总 (转)
- c语言全局变量和局部变量问题汇总(转)
- c语言中变量的类型浅析
- C语言困惑 - 多个同名变量的问题
- C语言自动变量的潜在问题
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)
- 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)
- C语言变量作用域、生存期及static问题
- C语言头文件中定义变量问题
- C语言中变量的初始化问题
- 关于“在C语言中只能在函数前面定义变量”的问题
- c语言全局变量和局部变量问题汇总
- C语言困惑 - 变量与类型同名问题