指针
内存
电脑为了更有效的使用内存,将内存分成了一个个的内存单元,一个内存单元的大小是一个字节,但是怎么用这些内存呢,电脑为了访问内存的每个单元,就给每个单元编号,这些编号就是一个地址,地址就是指针。
就如图所示。
变量的指针
变量是创建在内存中的,在内存分配空间,每个内存单元有地址,所以变量也有地址。
取出变量的地址:
int main()
{
// 地址 == 指针 == 内存单元编号
//内存单元为 1 个字节
int num = 10;// 每个字节都有地址,int num 就有四个地址
int* p = #// 取出的是第一个地址也是较小的那个
printf("%p", p);
}
因为int 类型是四个字节大小,所以就有四个地址,取出的是较小的那个,要打印地址用 %p。
变量在内存中如图(图中的地址只是列举)。
指针变量
我们先知道一个字节有一个地址,而不是一个地址的大小是一个字节。所以我们可以用指针变量来看看一个地址的大小是多少。
//指针变量
int main()
{
int num = 10;
printf("num = %d\n", num);
int* p;
p = #
*p = 20;// *p == a
//补充 在指针变量里什么都是地址
printf("num = %d", num);
return 0;
}
定义指针变量如上述代码一样,int* *号说明 p 是指针变量(* 号叫解引用操作符 ,&是取地址符)。将 num 的地址给 p ,*p 就相等于变量num。
可以用地址来改变变量 num 的值。所以除了int 类型,其他类型也可以。
指针变量的大小
指针变量的大小取决于地址的大小,我们用sizeof函数来看指针变量的大小
//指针变量的大小
int main()
{
printf("%zd\n", sizeof(char *));// 结果都为8,因为我的电脑是64位,所以所有指针变量大小都是8个字节
printf("%zd\n", sizeof(int *));// 32位电脑就是4个字节
printf("%d\n", sizeof(float *));// 地址哪来的,64位机器,64位物理地址线,64bit,2的64次方,这就是机器的内存
printf("%zd\n", sizeof(double *));// 一个字节有一个地址,都是不代表地址就是一个字节的,地址是8/4个字节的存储
printf("%zd\n", sizeof(short *));
printf("%d\n", sizeof(long *));
return 0;
}
结果为:
所有的指针变量的大小都是一样的,指针变量(地址)的大小就只取决于电脑。因为我的电脑是64位,所以所有指针变量大小都是8个字节,32位电脑就是4个字节。所以要存储地址就需要8个字节。再次提醒一个字节有一个地址,但是不代表地址就是一个字节的,地址是8/4个字节的存储。
这个图上的指针变量是四个字节。
结构体
有时候有些东西很复杂,我们怎么用类型来定义呢,这个时候我们就需要结构体来描述复杂类型。
我们来描述学生:
// 结构体类型
struct stu
{
char name[20];
int age;
char sex[5];
};// ;号是必要的
int main()
{
//结构体变量的初始化
struct stu a = { "张三", 20,"男" };// 变量.成员
printf("name = %s,age = %d, sex = %s\n", a.name, a.age, a.sex);
struct stu *p = &a;// 指针->成员
printf("name = %s,age = %d, sex = %s\n", p->name, p->age, p->sex);
}