1.5
指针
指针的基本概念 解引用操作符
内存是计算机中运行的程序的工作区,把内存分成一个一个很小的内存单元,每个内存单元的大小是一个字节内存是由很多个字节组成的,每个字节都有唯一的一个编号,这些编号称为该内存单元的地址32位电脑地址线有32根,2^32个内存单元,每个内存单元的大小是一个字节,所以内存大小是2^32个字节,按照提到过的换算单位,是4GB
int main() { int a = 10;//向内存申请4字节,存储10,int型变量大小4字节 printf("%p\n", &a);//%p是用于打印void*类型的,为了确保其可移植性,建议将&a强制类型转换未void*型。 //printf("%p\n",(void*)&a); int* p = &a;//p就是指针变量,把a的地址存到p里面//int*是变量类型 变量名叫p //存放指针(地址)的变量就是指针变量 *p = 20; //解引用操作符,意思是通过p中存放的地址找到p所指向的对象,* p就是p指向的对象 printf("d\n", a);//20 char ch = 'w'; char* pc = &ch; return 0; }
a是int型变量,占了四个字节的大小,占了四个字节,也就是4个地址,&a是四位中的第一个地址
//4字节32比特位 //0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 2进制
//0 0 0 0 0 0 0 0 0 a 16进制
内存中0x 00 00 00 0a 形式储存,监视中以倒序显示每次运行程序,a变量都会重新创建,故其地址每次运行结果不一样,进入调试模式后点击上方调试->窗口->内存/监视中查看
指针变量大小
int main() { ////int* p; ////char* p2; ////int* p1, p2, p3;//p1是指针变量,p2和p3是整型变量 ////int* p1, * p2, * p3;//p1,p2,p3都是指针变量 /*此四行旨在表示指针变量的输入格式基本规则,无法运行*/ ////无论什么类型的指针都是在创建指针变量 //指针变量是用来存放地址的 //指针变量的大小取决于一个地址存放需要多大空间 //32位及其地址:32bit位--4字节,所以指针变量大小是4字节 //64位及其地址:64bit位—8字节,所以指针变量大小是8字节 printf("%zu\n", sizeof(char*)); //上方x86是结果4字节,x64是8字节 printf("%zu\n", sizeof(short*)); //都 printf("%zu\n", sizeof(int*)); //是 printf("%zu\n", sizeof(float*)); //一 printf("%zu\n", sizeof(double*)); //样 return 0; }
结构体 struct
结构体 和 结构体指针操作符
面对复杂对象时,可以用结构体来描述C语言中给了自定义类型的能力,自定义类型中有一种叫结构体:struct结构体是把一些单一类型组合在一起的做法
struct Stu { //结构体成员变量 char name[20]; int age; char sex[10]; char tel[12]; };//创建了一个结构体类型Stu,相当于盖房子的图纸 int main() { struct Stu s = { "zhangsan", 20, "nan", "123456789" };//s是其中创建的一个变量 printf("%s %d %s %s\n", s.name,s.age,s.sex,s.tel); //s是结构体变量,name是结构体成员变量 return 0; }
struct Stu { char name[20]; int age; char sex[10]; char tel[12]; }; void print(struct Stu* ps)//括号中的相当于一个结构体变量ps的地址,定义了一个无返回值的函数print { printf("%s %d %s %s\n", (*ps).name,(*ps).age,(*ps).sex,(*ps).tel); //ps是结构体指针,->是结构体指针操作符,ps->name等价于(*ps).name printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tel); } int main() { print(&s); return 0; }