简单的了解指针
学习指针前,我们必须先要了解内存。
内存
内存是电脑上特别重要的存储器,计算机中所有程序运行都是在内存中进行的。
为了有效的使用内存,就把内存划分为一个个小的内存单元,每个内存单元大大小是1个字节
为了有效的访问到内存的每个单元就给内存单元进行了编号,这些编号称为该内存单元的地址
如图:
变量都有地址,取出变量的地址如下:
int main()
{
int a = 10;//向内存申请4个字节的空间,里边存放10
//%p 按照地址的方式来打印
printf("%p\n", &a);//&——取地址操作符
return 0;
}
F10调试,调出内存窗口输入&a,如图:
在0x0040F874中,因为0a的十六进制表示为10,所以0x0040F874存储的是0a。
0x0040F874所占的4个字节的空间,就是变量a所占的空间。
因为地址是连续的,0a的地址是74 ,所以0a后面的00的地址就是75,再往后就是76和77。
打印得到的地址是四个字节地址中,编号最小的地址。
每次调试,系统分配的地址都会有所不同。
地址就是指针,指针就是地址。
指针变量
将&a的地址存放到pa中,pa是一个存放地址变量,这样的变量被称为指针变量。
指针变量的写法是int* pa = &a;
pa 存放的变量a的地址,也就是说pa指向了变量a,因为变量a定义的是int, 所以pa的类型也是int。
如图:
int main()
{
int a = 10;
int* pa = &a;
char ch = 'w';
char* pc = &ch;
return 0;
}
* 解引用操作符
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;
printf("%d\n", a);
return 0;
}
*pa的意思是,通过pa存的呢个地址,去找到它所指向的那块空间a。
如果*pa = 20;呢么a的值是否改变呢?
运行后
如图,所以*pa所代表的意思就是变量a。
指针变量所占的空间
int main()
{
printf("%zu\n", sizeof(char*));
printf("%zu\n", sizeof(short*));
printf("%zu\n", sizeof(int*));
printf("%zu\n", sizeof(long*));
printf("%zu\n", sizeof(float*));
printf("%zu\n", sizeof(double*));
return 0;
}
运行结果是:
如图,每种类型都是4个字节空间。
原因是在32位机器上,有32根地址线,每个地址线由二进制数组成,所以有32个0/1组成,也就是32个bit位,32个bit位 等于 4 字节。
因此,64位就有8个字节空间大小。
简单的了解结构体
当描述一个复杂对象时,不能用一个简单的变量描述。
所以C语言提供了一个方式,用来描述这些复杂对象,这个方式就是结构体。
比如,描述一个学生,用到的信息有名字,年龄,性别,学号等。描述一本书,书名、价格、作者。
//声明学生类型
struct Student
{
char name[20];
int age;
char sex[5];
char id[12];
};
struct Book
{
char name[20];
int price;
char author[20];
};
int main()
{
//创建的结构体变量
struct Student s1 = {"张三",20,"男","20200506"};
struct Student s2 = {"lisi",30,"女","20200908"};
struct Book b1 = {"C语言程序设计",55,"谭浩强"};
//打印
//.操作符 用法是:结构体变量.成员名
printf("名字:%s\n年龄:%d\n性别:%s\n学号:%s\n", s1.name,s1.age,s1.sex,s1.id);
printf("%s %d %s\n", b1.name, b1.price, b1.author);
//指针
struct Book* pb = &b1;
printf("%s %d %s\n", (*pb).name, (*pb).price, (*pb).author);
//-> 用法是:结构体指针->成员名
printf("%s %d %s\n", pb->name, pb->price, pb->author);
return 0;
}
运行结果为: