【黑马程序员】C语言指针及指针注意事项

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

       C语言指针可以有效地表示复杂的数据结构,能够动态地分配内存,方便字符串的使用,更好地操作数组,完成获取多个函数运行结果的任务。更重要的是,可以直接处理内存单元地址等。

       指针变量的定义格式一般如下:

       类型说明 *变量名

       其中,“*”表示这是一个指针变量,变量名就是定义的指针变量的名称,数据类型说明符就是表示所定义的指针所指向的变量的数据类型。举例如下:

       ①int *p;

       ②float *p;

       ③char *p;

       第①行代码定义的是一个整型的指针变量,变量名是p,也就是说在变量p中存着一个内存单元地址,这个地址中保存的是一个int型的数据。

       第②行代码定义的是一个单精度的指针变量,变量名是p,同样在变量p中存着一个内存单元地址,这个地址中保存的是一个float型的数据。

       第③行代码定义的是一个字符型的指针变量,变量名还是p,变量p中还存着一个内存单元地址,这个地址中保存的是一个字符型数据。

       一个指针变量只能指向同类型的变量,也就是整型的指针变量只能指向整型变量,而不能指向其他变量。因为在指针运算的时候可以体现出这个道理,不同类型的指针在运算时移动的字节数是不一样的。

#include <stdio.h>

 

int main(int argc, const char * argv[]) {

    

    int i = 1;

    char p1 = &i;

    float j;

    j = *p1;

    

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

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

    printf("j = %.2f\n",j);

  

    return 0;

}

       程序在Xcode环境下运行时会提示报错信息,因为整型数据无法传递给单精度类型,数据无法继续运行下去。

定义指针变量后,必须为其赋具体的值,而且指针变量的复制只能赋予地址,绝对不可以是其他数据,并且要注意数据类型的一致。

       C语言指针一些注意事项:

       1, 关于声明

 

#include <stdio.h>

 

int main(int argc, const char * argv[]) {

 

       int num1;

       int *p1 = &num1;

       return 0;

}

       在描述类型的时候 p1 是 int* 类型

       2, 初始化

       使用指针的时候, 有一个规范, 凡是不指向数据的指针,应该为其赋值为 0 或 NULL。

#include <stdio.h>

 

int main(int argc, const char * argv[]) {

 

       int *p1 = 0;

       int *p2 = NULL;

       return 0;

}

 

       3, 关于运算

#include <stdio.h>

 

int main(int argc, const char * argv[]) {

    

    int num1 = 10;

    int *p1 = &num1;

    int num2 = 10;

    int *p2 = &num2;

    

    int a = *p1++;

    int b = *(p2++);

    

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

    printf("%d\n",b);

    

    return 0;

}

 

       首先让地址 ++, 然后取该地址的数据

       引申问题:*p++自增p还是p所指向的变量的问题

       后缀++和--操作符本质上比前缀一元操作符的优先级高,因此*p++和*(p++)等价,它自增p并返回p自增之前所指向的值。

       4, 指针类型的变量进行数学运算

       指针可以参与的数学运算只有 加 和 减

#include<stdio.h>

int main(int argc, const char * argv[]) {

       int num;

       int *p1 = &num;

       char *p2 = &num;

       short *p3 = &num;

 

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

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

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

 

       return 0;

}

       指针类型的数学运算由指针类型决定基本偏移量,而一般的加减法是在基本偏移量作为单位的情况下进行计算的。

       p + n

       存储的地址 + n * 单位地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值