地址与指针
地址
在内存(
注意,我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间
)当中,简单点说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们同意以毫米为单位,一把长1000毫米的尺子,其范围区间为0~999,而我们可以精确的找到35毫米,256毫米处的位置。同样道理,内存也是如此,也是像尺子一样线性排布,只不过这个范围略大,在我们最广泛使用的32位操作系统下,是从0~4294967295
之间,而地址就是这之中的一个编号而已,习惯上,在计算机里地址我们常常用其对应的十六进制数来表示,比如0x12ff7c这样。在我们C程序中,每一个定义的变量,在内存中都占有一个内存单元,比如int类型占四个字节,char类型占一个字节等,每个字节都在0~4294967295
之间都有一个对应的编号,C语言允许在程序中使用变量的地址,并可以通过地址运算符"&
"得到变量的地址。
int i ;
int a[4] = {'a','b','c','d'};
for (int i = 0; i < 4; ++i)
{
/* code */
printf("int address:0x%x,value:%c\n",&a[i], a[i]);
}
int address:0xe164ec00,value:a
int address:0xe164ec04,value:b
int address:0xe164ec08,value:c
int address:0xe164ec0c,value:d
指针
简单的讲,地址就是逻辑内存上的编号,而指针虽然也标识一个编号,也是一个地址,但两者性质却不相同,一个代表常量,另一个则是变量。就好比内存是一把尺子,而指针就是尺子上的游标,可以左右移动,他某一时刻是指向一个地方的,这就是指针变量。
由于指针存放的都是地址,在32位操作系统下在0~4294967295
这个区间内,所以:在32位操作系统下,任何类型的指针变量都占4个字节!
在64位操作系统下,任何类型的指针变量都占8个字节!
int main()
{
int *p;
char *p1;
float *p2;
double *p3;
struct INFO *p4; //struct INFO类型为结构体类型 我们将会在后面的章节中讲解
void *p5;
printf("int point size is :%d\n",sizeof(p));
printf("char point size is :%d\n",sizeof(p1));
printf("float point size is :%d\n",sizeof(p2));
printf("double point size is :%d\n",sizeof(p3));
printf("struct point size is :%d\n",sizeof(p4));
printf("void point size is :%d\n",sizeof(p5));
return 0;
}
打印结果64位下
int point size is :8
char point size is :8
float point size is :8
double point size is :8
struct point size is :8
void point size is :8
[Finished in 0.1s]
数组与指针
由于每个数组元素,相当于一个变量,因此指针可以指向数组中的元素,也就是说可以用指针方式访问数组中的元素,对于一个指向数组元素的指针变量的定义和赋值方法,与指针变量相同。
C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此:
int *p; /*定义 p 为指向整型变量的指针*/
p=a; /*等价于 p=&a[0]; */
int *p=a; /*等价于 int *p=&a[0]; */
对于指向首地址的指针p,p+i或(a+i)就是数组元素a[i]的地址,(p+i)或(a+i)就是a[i]的值。
如果指针变量p已指向数组中的某一个元素,则p+1指向同一数组的下一个元素。
int i;
int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p=a;
for(i=0;i<10;i++)
{
printf("P Value:%d a Value :%d\n",*(p++),*(a+i));
}
printf("\n");
return 0;
打印结果
P Value:1 a Value :1
P Value:2 a Value :2
P Value:3 a Value :3
P Value:4 a Value :4
P Value:5 a Value :5
P Value:6 a Value :6
P Value:7 a Value :7
P Value:8 a Value :8
P Value:9 a Value :9
P Value:0 a Value :0
网友评论