C 多级指针


C 多级指针


正文

什么是指针?

Bit意为"位"或"比特",是计算机运算的基础,值为0、1;
Byte意为"字节",简写为B,是计算机文件大小的基本计算单位;
KB——千字节
MB——兆字节
GB——吉字节
TB——太字节 
 
1B = 8Bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB 

储存器中将能够存放一个八位二进制数的区域称为一个字节或一个内存单元。每个内存单元都有一个唯一的编号, 这个编号称为内存单元的地址。

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。

就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

指针变量声明的一般形式为:

type *var-name;
* 号是指针运算符。 *var-name 代表指针变量所指向的变量的值(变量的右值)。
& 符号是取地址运算符。&var-name 代表变量存储的地址(变量的左值)。

变量一旦定义,就具有类型(type)、名称(name)、值(value)和地址(address)四个方面的属性。

通常,将变量的地址称为变量的左值,将变量的值成为变量的右值。

指针变量的赋值有两种方式:

方式1,初始化声明时就赋值:

int a, *p = &a;

指针初始化声明时就赋值,应该取的是变量的地址。数组和字符串,变量本身就是指向内存首地址。

方式2,初始化声明后具体使用时再赋值:

int a, *p;
p = &a;

p储存的是所指向变量的地址,*p指向p所储存变量地址上的具体值。

值得一说的是定义指针变量时用到的 *号和执行语句中用到的 *号,虽然形式上一样,但是意义完全不同。看一下下面的例子:

void main()
{
    int a = 10, *p;                      // *p 表示p是一个指针变量
    p = &a;                              // 将a的地址储存在p中
    printf("\na=%d,*p=%d\n", a, *p);        // *p指向p所储存变量a的地址上的具体值
}

运行结果: a=10,*p=10

指针与数组

指针与一维数组

指针与字符串

指针数组

数组的元素都是指针则为指针数组。

指针数组定义形式:

数组类型符 *数组名[长度];

二级指针

二级指针变量的定义形式:

数据类型名 **二级指针变量名
#include <stdio.h>

void main()
{
    int a = 5, *p = &a, **q = &p;
    printf("a=%d, &a=%p, *p=%d, p=%p, &p=%p, **q=%d, *q=%p, q=%p", a, &a, *p, p, &p, **q, *q, q);
}

输出: a=5, &a=0x7fff5809cc54, *p=5, p=0x7fff5809cc54, &p=0x7fff5809cc48, **q=5, *q=0x7fff5809cc54, q=0x7fff5809cc48

可以看出,p储存的是a的地址,q储存的是p的地址, 所以*p指向p储存的地址上的值即a的值, *q指向q储存的地址上的值即p的值即a的地址, **q指向 *q指向的q储存的地址上的值的地址上的值即p储存的地址上的值即a的值。

数组指针

可定义一个指向数组的指针,这种指针称之为数组指针。

数组指针的定义形式:

数据类型符 (*变量名)[长度]

指针与二维数组

二维数组名相当于数组指针。

看一个例子:

#include <stdio.h>

void main()
{
    int a[3][4] = { {1,2,3,4}, {5,6,7,8},{9,10,11,12} };
    int (*p)[4];
    int *q;
    int i, j;
    printf("\n");
    // 用下标法输出
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            printf("%4d", a[i][j]);
        }
    }
    printf("\n");
    // 用指针变量输出
    for(q = a; q < &a[2][3]; q++)
    {
        printf("%4d", *q);
    }
    printf("\n");
    // 用数组指针输出
    p = a;
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            printf("%4d", *(*(p+i)+j));
        }
    }
    printf("\n");
    // 用数组名输出
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            printf("%4d", *(*(a+i)+j));
        }
    }
    printf("\n");
}






参考资料

C 指针 https://www.runoob.com/cprogramming/c-pointers.html

《C语言程序设计基础》 安徽大学出版社 鲍广华主编、钦明皖副主编


返回