1.指针
要学习指针,就得理解内存 指针就是用来访问内存的
內存
內存是电脑上特别重要的存取器,计算机中程序的运行都是在内存中进行的
所以为了有效的使用内存,就把内存划分为一个个小小的内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的的地址
在C语言中 地址编号也是叫指针 编号 == 地址 == 指针 三个表达的意思相同
编号
在计算机上,有地址线,也就是物理的电线
可传递高低电平的信号,转换为数字信号:高电平为1,低电平为0。所以计算机采用2进制,每个信号(1/0)是一个二进制位,也就是bit位
32位计算机,上面有32根地址线,每个地址线会传递一个数字信号,所以会产生2的32次方个不同的信号编号,这些编号可以管理2的32次方个字节,4GB的内存,就是可以为每个字节进行编号,可以通过编号找到他们在内存中的位置。我想肯定会有人问,为什么以字节为单位编号,那是因为我们所学的数据类型中char字符型所占内存最小,为一个字节,所以字节为单位最好。
现在计算机一般是64位,这样可以管理更多的内存。
1.1 指针的使用:
//程序运行起来,要加载到内存中,也要申请内存空间使用 int main() { int a = 15;//a是int类型 //所以向内存中申请了4个字节的空间 来存放15这个数值 //虽然a占用4个字节,但我们&a的时候,拿到的是4个字节中的的第一个字节的地址 //%p - 专门用来打印地址的,是16进制的形式表示地址的 printf("%p", &a);//&取地址符,拿到a的地址 int* pa = &a;//pa用来存放a的地址,是一个变量,叫指针变量 意思是存放指针的变量 // * 是为了表示 pa 是一个指针变量 //int 是为了表示 pa 指向的是 int 类型的变量 //可以通过地址找到a *pa = 30;// * 解引用操作符,*pa就是a printf("%d\n", a);//打印30; //提供了另一种方式对a进行操作 return 0; }
指针 - 地址 - 编号 三个意思相同
指针变量 - 是一个变量 - 就是存放地址的变量
口头语中说的指针,基本上都是指针变量。
1.2 指针变量的大小
指针变量是用来存放地址的
32位机器:地址是32个2进制位,也就是32个bit位,1个字节8个bit位,所以这个地址要存储的话要4个字节。所以在32个机器上,指针变量的大小是4个字节
64位机器:64个2进制位,这个地址要存储的话要8个字节。
所以,指针变量的大小与它指向的数据的类型是没有关系的,它的大小只与操作系统的位数有关。
int main() { int a = 10; int* p = &a; printf("%d\n", sizeof(p));//32 4个字节 64位 8个字节 printf("%d\n", sizeof(int*));//32 4个字节 64位 8个字节 return 0; }
在VS2022编译器上,可以自己改变编译环境位数。x64位64位环境,指针变量大小为8个字节。x86为32位环境,指针变量大小为4个字节。
2.结构体
char short int 等数据类型是比较单一的
不足以描述一些复杂类型,如学生,书
学生 :名字 年龄 性别等
书 : 书名 作者 定价
C语言中引入了结构体描述复杂对象 使用关键字struct
2.1结构体的使用和结构体变量的创建
//学生 结构体 struct Student//Student为结构体名称,可以随意设置 { //学生的相关属性 结构体成员 char name[20];//名字—字符串 ,一个汉字是2个字符 int age;//年龄 char sex[5];//男 女 保密 数组长度[5]是因为保密4个字符 \0一个字符 }; //书 结构体 struct Book { //结构体成员 char name[20]; char auther[10]; float price; }; int main() { //创建结构体变量s struct Student为结构体类型 struct Student s = {"西兰花",19,"男"};//s 学生结构体变量 struct Book b = { "《初识C语言》","西兰花",66.6f };//b 书结构体变量 //.操作符 通过结构体变量访问结构体成员 printf("%s %d %s\n", s.name, s.age, s.sex); printf("%s %s %f\n", b.name, b.auther, b.price); //这里价格浮点型数据,会精度丢失,不能准确打印,后期会讲 }
2.2结构体指针
struct S//S结构体类型 { char name[20]; int age; float score; }; void print1(struct S t) { //第一种访问结构体成员写法 //语法: 结构体变量.成员 printf("%s\n%d\n%.2f\n", t.name,t.age,t.score); } void print2(struct S* ps) { //第二种访问结构体成员写法 //语法: 结构体变量.成员 与第一种相同,解引用结构体指针得到的也是结构体变量, printf("%s\n%d\n%.2f\n", (*ps).name, (*ps).age, (*ps).score);//.的优先级比 * 高,所以加() //第三种访问结构体成员写法 //语法: 结构体指针->成员 printf("%s\n%d\n%.2f\n", ps->name, ps->age, ps->score);//-> } int main()//先执行main函数 { //创建结构体变量 struct S s = { "是个西兰花",20,99.9f }; print1(s);//调用自己编写输出函数 print2(&s);//这里传入的是结构体变量的地址,&s,取出s的地址 return 0; }
初识C语言系列结束,后面文章会对每个模块进行详细讲解,谢谢大家支持。