C语言

2018-12-11  本文已影响8人  41c48b8df394

地址与指针

地址

在内存(注意,我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间)当中,简单点说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们同意以毫米为单位,一把长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
上一篇下一篇

猜你喜欢

热点阅读