C语言学习笔记4

来源:互联网 发布:零基础如何学好c语言 编辑:程序博客网 时间:2024/05/16 10:10

一级指针和多级指针

一级指针

指针的基本用法:

32位系统下指针是4个字节,64位系统下指针第8个字节
* 在配合数据类型定义变量的时候使用 * 号,是代表这个变量的类型是指针类型

    int a; // 定义一个整型指针变量,并赋值10    int *p = &a; // 定义一个整型指针变量,指向 a 的地址
  • 在配合变量进行操作的时候使用 * 号,是取值运算符,意思是可以去除这块内存空间的值
    printf("%d\n", *p); // 取出 p 指向内存空间的值    printf("%d\n", *p += 1); // 取出p指向的内存空间的值,并自增1    printf("%d\n", a); // a的值也会被修改是11

指针的集中特殊定义方式:

指针常量

    int *const p;
  • p是 int* 类型,const 修饰的是p,所以p是向量
  • 则 p 指向的地址不可修改也就是说不能再指向其他地方了
  • 但是,可以修改他所指向的地址里的值。
    举例:
    int a = 10;    int b = 20;    int *const p = &a;    p = &b; // 错误    *p = 100; // 允许

常量指针

    const int *p;    int const *p;
  • p是 int* 类型,const 修饰的是 *p,所以 *p 是常量
  • 则 p 是一个指向常量的指针,也就是说其可以指向其他地址
  • 但是,其所指向的地址里的值不能修改
    举例:
    int a = 10;    int b = 20;    const int *p = &a;    p = &b; // 允许    *p = 100; // 错误

常量指针常量

    const int *const p;
  • p 是 int* 类型,const 分别修饰了 p 和 *p,所以 p 和 *p 都是常量
  • 则p是一个指向常量的指针常量
  • 也就是说这个指针指向的地址不可修改,地址里的内容也不可修改
    举例:
    int a = 10;    int b = 20;    const int* const p = &a;    p = &b; // 错误    *p = 100; // 错误

切记
* 如果你定义了一个指针,那么就一定要知道这个指针指向了什么地方,而且你要保证你定义的这个指针是正确而且有效的
* 如果你乱用,那么就会出现程序崩溃来惩罚你
* C语言之所以强大、自由、执行高效,很大部分是体现在指针的灵活运用上

多级指针

定义一个一级指针

    int *p = NULL;

定义一个二级指针

    int **pp = &p;

定义一个三级指针

    int ***ppp = &p;
  • 在 printf 打印的时候 %p 打印地址, %d 打印整数, %f 打印浮点数, %s 打印字符串,%c 打印字符
    举例:
#include <stdio.h>int main(void){    int a = 10;         // 定义一个整型变量 a,值为 10    int *p = &a;        // 定义一个一级整型指针变量p,值为 a的地址    int **pp = &p;      // 定义一个二级整型指针变量pp,值是 p的地址    int ***ppp = &pp;   // 定义一个三级整型指针变量ppp,值是 pp 的地址    printf("%p, %p, %p, %p\n", &a, &p, &pp, &ppp);    // 取出各个变量自身在内存的地址    printf("%p, %p, %p, %p\n", &a, p, pp, ppp);    // 除了 &a之外,都是打印各个指针变量存储的值    printf("%p, %p, %p, %p\n", &a, p, *pp, **ppp);    // %p打印地址(其实是按十六进制方式打印出)    // 1. 利用取地址运算符&,打印变量 a 的地址    // 2. 直接打印p的值,也就是 a 的地址    // 3. 利用取值运算符*,取出二级指针变量pp的值,也就是一级指针p的地址,在通过%p打印出p的值,也就是 a 的地址    // 4. 利用取值运算符*,取出三级指针变量ppp的值,也就是二级指针pp的地址,再通过取值运算符*,取出二级指针pp的值    //      也就是p的地址,再通过%p打印出p的的值,也就是 a 的地址    printf("%d, %d, %d, %d\n", a, *p, **pp, ***ppp);    // 如果要取出变量a的值,那么用了多少级指针,就用多少个取值运算符,    // 在取出最后的值之前,各级指针取出的值都是其上一级指针的地址    return 0;}
0 0
原创粉丝点击