x13870285957头像
c语言中内存和指针的基本认识;不同指针类型的意义讲解封面图

c语言中内存和指针的基本认识;不同指针类型的意义讲解

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//指针
//1.内存和地址
//内存 - 8 -,- 16 -,- 32 -(也就是电脑中各种应用在cpu中运行所需要占用的内存)
//char类型为一个字节(一个内存单元) = 八比特(二进制八位00000000)
//其中,每个内存单元,相当于⼀个学⽣宿舍,⼀个字节空间⾥⾯能放8个⽐特位,就好⽐同学们住的⼋⼈间,每个⼈是⼀个⽐特位。
//每个内存单元也都有⼀个编号(这个编号就相当于宿舍房间的⻔牌号),有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间。
//⽣活中我们把⻔牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。
//C语⾔中给地址起了新的名字叫:指针。
//所以我们可以理解为:
//内存单元的编号 == 地址 == 指针


//⽽CPU和内存之间也是有⼤量的数据交互的,所以,两者必须也⽤线连起来。总共有三种线1.地址总线,2.数据总线,3,控制总线
//当需要读取数据时,此时数据总线会给出一个读取信号,然后由cpu通过地址总线读取地址(通常为十六进制)在内存中找到所在位置(假如该位置存放了数据66)
//在由内存通过数据总线传输到cpu得到该位置存储的数据信息
//当需要写入数据时,此时数据总线会给出一个写入信号,然后由cpu通过地址总线写入地址(通常为十六进制)在内存中创建该位置(存储在内存中为二进制)
//在由cpu通过数据总线传输到内存中该位置写入需要的数据信息


//计算机内是有很多的硬件单元,硬件单元是要互相协同工作的。所谓的协同,⾄少相互之间要能够进⾏数据传递。地址总线
//指针变量和地址:取地址操作符( & )
//int main()
//{
//    int a = 10;//创建的本质就是向内存申请一块空间,用来存储数据,这里就是申请内存空间4字节,存储数据10
//    int* p = &a;//编号 = 地址 = 指针
//    //p(pointer - 指针 -)被称为指针变量,理解为:专门存放指针(编号)的变量
//    //int是在说明a的类型为整型,*在说明p是指针变量
//    return 0;
//}

//指针变量和解引⽤操作符(*)
//int main()
//{
//    int a = 10;
//    int* p = &a;
//    *p = 0;//
//    printf("%d\n", a);//0
//    return 0;
//}

//示例
//int main()
//{
//
//    char* p;
//
//    printf("%zu\n",sizeof(p) );
//    printf("%zu\n",sizeof(char*) );
//    printf("%zu\n",sizeof(int*) );
//    printf("%zu\n",sizeof(float*) );
//    printf("%zu\n",sizeof(long float*) );
//    printf("%zu\n",sizeof(double*) );
//    printf("%zu\n",sizeof(long double*) );
//    printf("%zu\n",sizeof(long*) );
//    printf("%zu\n", sizeof(long long*));//在x64运行情况下全部都为8个字节;在x84运行情况下全部都为4个字节
//    //是因为不管是是 p 、还是各种类型 + *,都是用于存放指针的,而指针 = 地址 = 编号
//    //意思就是不管什么类型数据,它的指针(编号)长度都是一样的,只是其组成指针的数字不一样 
//    return 0;
//}

//指针类型解引用
//int main()
//{
//    int a = 0x11223344;
//    //int* ap = &a;
//    //char* ap = &a;
//    double* ap = &a;
//    *ap = 0;//由于初始化时为int型,则int*,*ap赋值0则把内存中四个字节都赋0了
//            //当初始化时为char型,则char*,*ap赋值0则把内存中第一个字节赋0了,其他不变
//            //当初始化时为double型,则double*,该类型需要访问八个字节,int型只有四个字节,就会程序崩溃
//    return 0;
//}//总结:需要访问指针时,需要选择好对应类型,轻则不能达到想要的效果,重则程序崩溃
         //指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节

//指针类型+-整数
//int main()
//{
//    int a = 10;
//    int* pa = &a;
//    char* pc = &a;
//    printf("pa =%p\n", pa);//打印地址要用%p
//    printf("pc =%p\n", pc);//会发现打印的两个不同类型的指针是一样的
//    printf("pc + 1 =%p\n", pa+1);//int类型,加一指针加了四个字节
//    printf("pc + 1 =%p\n", pc+1);//char类型,加一指针加了一个字节
//    return 0;
//}//结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)

//特殊void类型(用于存放和查看,后续还会有其他作用)
int main()
{
    int a = 10;
    char b = 'x';
    void* pa = &a;
    void* pb = &b;
    //*pa = 11;//报错
    //*pb = 'l';//报错
    return 0;
}//可以理解为⽆具体类型的指针(或者叫泛型指针),这种类型的指针可以⽤来接受任意类型地址。
//但是也有局限性, void* 类型的指针不能直接进⾏指针的 + -整数和解引⽤的运算。


 

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/x13870285957/article/details/161651040

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--