#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




