一、C语言中变量的实质
对内存空间的理解
内存作为一个存放数据的空间,而数据存放在不同的内存空间中,要找到这些数据,我们就需要对内存进行编号,即给内存一个身份,这就是内存编址。内存按一个字节接一个字节的次序进行编址。每个字节都有一个编号,这个编号就叫做内存地址。
C/C++语言变量声明有:
int i;
char a;
每次我们使用变量时都需要事先声明,本质上就是在内存中申请了一个名为i的整型变量宽度空间(一个名为a的字符型变量宽度空间).
赋值给变量
如以下赋值语句:
i = 30;
a = 't';
变量地址&i
&i的意思是返回i变量的地址编号。
如果要显示变量的地址值,有如下代码:
printf("%x", &i);
printf("%x", i);与printf("%x", &i);的区别即在于后者显示的是变量的地址值。
以上为我们必须掌握的基本C语言编程语法。
什么是指针:
int *pi;是一条指向整型变量的指针语句,这其中pi是一个指针变量,即本质上还是一个变量,一个具有指针功能的变量。
举例如下:
pi = &i;
整句意思是把i的地址编号赋值给pi。
如图所示 pi 的值为6,6就是变量 i 的地址编号,这样 pi 就指向变量 i 。所以指针变量所存的内容就是内存的地址编号。
那么又有如下语句:
printf("%d", *pi);*pi 的意思是 pi 内容所指地址的内容。依然拿上述做例,pi的内容是6,指向内容编号为6的地址。*pi指向地址编号6的内容,就是30这个值。
指针与数组名
通过数组名访问数组元素
有如下两段代码:
int i, a[] = {1,2,3,4,5,6,7};
for (i = 0; i <=7; i++){
printf("%d\n" , a[i]);
}
int i, a[] = {1,2,3,4,5,6,7};
for (i = 0; i <=7; i++){
printf("%d\n" , *(a+i));
}
两段代码的作用都是显示a数组个元素的值。
通过指针访问数组元素
int i, *pi, a[] = {1,2,3,4,5,6,7};
pi = i;
for (i=0, i<=7, i++){
printf("%d\n", pi[i]);
}
int i, *pi, a[] = {1,2,3,4,5,6,7};
pi = i;
for (i=0, i<=7, i++){
printf("%d\n", *pi+i);
}
如上两段代码也是显示a数组的各元素值。pi=i,即数组名赋值给指针,这两段代码与上述两段代码并无差异,因此也验证了数组名就是指针。
我们再看数组名与指针变量的区别
先给出结论,数组名只是一个指针常量,而指针是会随着循环的不断递增(递减)而不断改变,因此数组名不能进行a++的操作。
有如下代码:
int i, *pi, a[] = {1,2,3,4,5,6,7};
pi = i;
for (i=0, i<=7, i++){
printf("%d\n", *pi);
pi++;
}
当我们运行上述代码时把pi改成i就会发现程序报错,即出现问题:数组名作为常量,七值是不能修改的。