c语言之指针的使用

这里对指针的理论知识不做多的讨论,简单列举几例,以便参考

可以把指针理解为内存的地址编号。也就是,指针就是地址,地址就是指针。

1.指针变量

本质是个变量,存放的是指针。
指针在32位平台的计算机中都是4个字节,在64位平台的计算机中都是8字节。

测试:
#include <stdio.h>
int main(int argc, const char *argv[])
{
    printf("%ld\n",sizeof(char *));
    printf("%ld\n",sizeof(short *));
    printf("%ld\n",sizeof(int *));
    printf("%ld\n",sizeof(long *));
    printf("%ld\n",sizeof(float *));
    printf("%ld\n",sizeof(double *));
    printf("%ld\n",sizeof(void *));
    return 0;
}

指针变量的使用

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int num = 66; 

    int *p; //定义个指针变量

    p = &num;//指针变量赋值
    printf("p = %d\n",*p);

    *p = 88; //改变指针变量的内容
    printf("p = %d\n",*p);

    num = 99; //通过修改num改变指针变量的内容
    printf("p = %d\n",*p);

    return 0;
}                                                                                                                   
运行结果:
p = 66
p = 88
p = 99

指针变量的跨度
由指针变量指向的类型大小决定。
指针变量自身的类型: 将变量名 拖黑 剩下啥类型 指针变量自身就是啥类型。
指针变量指向的类型:将变量名和离他最近一个* 一起拖黑 剩下啥类型 指针变量指向的类型就是啥类型。

我的电脑是64位的,所以int **p4的跨度位8位:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    char *p1 = NULL;
    printf("p1 = %u\n",p1);
    printf("p1+1 = %u\n",p1+1);

    short *p2 = NULL;
    printf("p2 = %u\n",p2);
    printf("p2+2 = %u\n",p2+1);

    int *p3 = NULL;
    printf("p3 = %u\n",p3);
    printf("p3+1 = %u\n",p3+1);
    
    char **p4 = NULL;
    printf("p4 = %u\n",p4);
    printf("p4+1 = %u\n",p4+1);
    
    int **p5 = NULL;
    printf("p5 = %u\n",p5);
    printf("p5+1 = %u\n",p5+1);
    return 0;
}
~                                                                                                        

运行结果:
p1 = 0
p1+1 = 1
p2 = 0
p2+2 = 2
p3 = 0
p3+1 = 4
p4 = 0
p4+1 = 8
p5 = 0
p5+1 = 8

指针变量的取值宽度:指针变量 指向的类型决定

混合使用指针,取地址。
例子:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int addr = 0x11223344;

    char *p1;
    p1 = &addr;
    printf("p1+3 = %#x\n",*(p1+3));

    short *p2;
    p2 = &addr;
    printf("p2+1 = %#x\n",*(p2+1));

    int *p = &addr;//这里理解为p=&addr;而不是*p=&addr.
    printf("P=%#x\n",*(p));

    char *p3 = &addr;
    p3 = p3+1;
    printf("p3 = %#x\n",*(short *)p3);
    
    return 0;
}

p1+3 = 0x11
p2+1 = 0x1122
P=0x11223344
p3 = 0x2233

指针使用时应注意:
1

//不要操作未初始化的指针变量
//p1保存的是一个随机地址 容易访问非法内容 造成段错误
int *p1;
printf("*p1 = %d\n", *p1);//段错误

2

//不要操作 初始化 为NULL的指针变量
int *p2 = NULL;
printf("*p2 = %d\n", *p2);//段错误

3

//不要给指针变量赋 无意义的数值
int *p3 = 2000;
printf("*p3 = %d\n", *p3);//段错误

4

//不要操作越界的空间
int data = 100;
int *p4 = &data;
p4 = p4+1;
printf("*p4 = %d\n", *p4);//非法操作

5

//万能指针可以保存任意类型的地址
void *p;
int num = 10;
p = &num;
//不能直接操作万能指针范围所存储的空间对应的内容
 printf("*p = %d\n", *p);//err 不能使用*p
//必须对万能指针 强制类型转换才能取对应空间的内容
printf("*p = %d\n", *(int *)p);

6

//void 不能用于定义变量
//void num;//err
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值