C语言_指针

指针

     定义一个指针变量

     变量类型 变量名 初始值

     变量类型为int *, 变量名p, 初始值NULL

     int-->0 double-->0.0  float -->0.0f char-->'\0' 指针-->NULL

     int *p = NULL;

     指针的定义方式可以有三种

     int* P = NULL;

     int *p = NULL;

     int * p = NULL;

    

     测试指针变量所占空间大小

     只与操作系统有关

     整型指针所占空间大小

    printf("%lu\n", sizeof(int *));

     字符型指针变量所占空间大小

    printf("%lu\n", sizeof(char *));

    

    

    

     打印指针所存放的地址

    int *p = NULL;

    printf("p = %p\n", p);

    int a = 3;

    printf("a = %p\n", &a);

    

     指针变量的赋值

    p = &a;

    printf("p = %p\n", p);

    int b = 5;

    printf("b = %p\n", &b);

    p = &b;

    printf("p = %p\n", p);

    

    

     pointer

     通过指针变量所存地址来访问数据

    int *p = NULL;    

    int a = 3;

    p = &a;

     一个新的操作符 *

     * 取值操作符(根据内存地址取内容或者取数据)

     & 取址操作符

     通过p找到内存地址, 再使用*操作来修改内存当中的数据

    *p = 5; // 可以近似的理解为*p恒等于a(前提条件, p不重新赋值)

    printf("a = %d\n", a);

    

     p = &a;

     *p = *&a = a;

    

     指针的移动

    printf("p  = %p\n", p);

    printf("p- = %p\n", p - 1);

    printf("p+ = %p\n", p + 1);

    

     不同类型的指针变量决定指针每次移动的字节数

     决定从内存当中取多少个字节的数据

    

    int a = 30000;

     用一个char类型的指针保存a的地址

    char *p = &a;

    

     通过*操作来取内存当中的数据

    

    printf("%d\n", *p);

    

    

     相同的操作在不同的地址, 得到的结果会不大相同

     int *p = NULL;

     *p = 5;

    

    

    

     数组的本质: 一段连续的内存

     数组名: 数组的首地址(首元素的首地址) 常量地址

     array 恒等于 &array[0]

    int array[5] = {3, 2, 5, 6, 7};

     定义一个指针变量用来保存数组的首地址

    int * p = array;

     思考: * p 是什么-->相当于是array[0]

    printf("*p = %d\n", *p);

     那么*(p + 1)是什么

     P + 1相当于array[1]

     *(p + 1)-->*&array[1]-->array[1]

    printf("*(p + 1) = %d\n", *(p + 1));

     *p + 1 是什么

     *p --> array[0]

     array[0] + 1

    printf("*p + 1 = %d\n", *p + 1);

    

    

     array[2] -- p[2] -- *(array + 2) -- *(p + 2)

     语法糖

    

    

     定义一个字符串

    char string[20] = "MobileInternet";

     定义一个指针保存字符串的首地址

    char *s = string;

    printf("%s\n", string);

     b开始打印到字符串结束

    printf("%s\n", s + 2);

     通过指针修改字符串当中的单个字符

     想把InterI改成i

    s[6] = 'i';

     printf("%s\n", string);

    s[6] = '\0';

     等同与 s[6] = 0;

    printf("%s\n", s);

    

    

     定义一个指针数组

     定义数组有几部分?

     数组类型 数组名[数组长度] = {初值};

    char * strings[3] = {"iPhone", "Android", "Unity3D"};

    char * s1 = "iPhone";

     s1是字符串的首地址, *s1是字符串的第一个字符

    char * s2 = "Android";

    char * s3 = "Unity3D";

    char * strings[3] = {s1, s2, s3};

    

     遍历一个数组, 需要用循环

    for (int i = 0; i < 3; i++) {

        printf("%s\n", strings[i]);

    }

    

    

     注意事项

   

    char * s1 = "iPhone";

     s1保存的是常量串iPhone的地址

     相当于把iPhone第地址拷贝一份赋值到指针变量s1

    char s2[] = "iPhone";

     s2是一个栈区的数组

     相当于把iPhone这个字符串拷贝了一份存放到s2这个字符数组中

     修改s2'p'字符为'p'

    s2[1] = 'p';

    printf("%s\n", s2);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值