【Linux——C语言之指针基础复习】

本文通过示例深入讲解了C语言指针的概念,包括指针的大小、如何定义指针、指针变量的类型以及指针偏移。通过sizeof函数展示了不同数据类型的内存占用,并演示了如何使用指针取地址和取值。同时,文章还探讨了不同类型的指针在内存偏移上的差异。
摘要由CSDN通过智能技术生成

 1)首先,关于C语言指针的复习,首先得知道C语言的每种类型,在内存中大小是怎么样的,如果忘记的话,可以利用sizeof函数进行查看大小即可。

2)其次,定义一个指针,用*号去定义,它与后边的*p不一样,后边是直接取地址里对应的值出来。

3)然后,关于指针变量的类型,分为两种,一种是自身的类型,一种是指向的类型,指向的类型决定了所取空间内容的长度,就是可以取多少字节的空间,以及一次偏移的大小是多大的。

#include <stdio.h>

void test01()
{
    //基本类型double float long int short char
    //分别占用8字节、4字节、4字节、 4字节、2字节、1字节
    char ch;
    printf("sizeof(ch) = %d\n",sizeof(ch));

    short k;
    printf("sizeof(k) = %d\n",sizeof(k));

    int num;
    printf("sizeof(num) = %d\n",sizeof(num));

    long l;
    printf("sizeof(l) = %d\n",sizeof(l));

    float m;
    printf("sizeof(m) = %d\n",sizeof(m));

    double b;
    printf("sizeof(b) = %d\n",sizeof(b));
}

void test02()
{

        
    int num = 10;
    printf("%p\n",&num);
    //取地址用&
    //&num代表变量num的起始地址
 
    int *p =NULL;
    printf("sizeof(p) = %d\n",sizeof(p));
    //定义一个指针变量,来保存num的地址
    //在定义的时候:*号说明p是指针变量
    

    p=&num;
    //num的地址与p建立关系
    printf("num = %d\n",num);

    printf("*p = %d\n",*p);
    //使用*p 表示取保存的地址编号 对应空间的内容
}

void test03()
{
    int num = 100;
    int *p = &num;
    //指针变量两种类型:自身的类型  指向的类型
         //自身的类型:将变量去掉即可 
             //p自身的变量就是 int *
        //指向的类型:在指针变量定义的时候将 变量名和离它最近的一个*一起去掉即可
            //p指向的类型是 int 
        //指针变量指向的类型的作用:决定了指针变量 所取空间内容的宽度(指针变量的跨度)

    printf("&num = %u\n",&num);
    //打印num地址3212921248

    printf("p = %u\n", p);
    //打印p地址3212921248

    printf("p+1 = %u\n", p+1);
    //打印地址p+1 = 3212921252
    //由上面可以知道,指针变量指向的类型为int,所以一次偏移4字节

    char *q = &num;
    printf("&num = %u\n",&num);
    //打印num地址3215036956


    printf("q = %u\n", q);
    //打印p地址3215036956


    printf("q+1 = %u\n", q+1);
    //打印地址p+1 = 3215036957
    //由上面可以知道,指针变量指向的类型为char,所以一次偏移1字节
    printf("*q = %d\n",*q);
    //结果为100
   
}
void test04()
{

    int num = 0x01020304;

    int *p = &num;
    printf("*p = %#x\n",*p);
    //*p = 0x1020304

    char *q = &num;
    q+=1;
    //一次偏移一个字节
    printf("*q = %#x\n",*q);
    //*q = 0x03

    short *k = &num;
    k+=1;
    //一次偏移两个字节
    printf("*k = %#x\n",*k);
    //*q = 0x0102
   



}





int main()
{
       
    // test01();
    // test02();
   // test03();
     test04();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值