初始指针

内存

内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的

所以为了有效地使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

内存可以类比成现实生活中的空间,如果想要找到一个地方,我们就需要知道对应的地址

此时有两个问题

1.内存是怎么编号的

2.一个这样的内存单元会占用多大的空间

1.内存是怎么编号的

在讨论计算机是会考虑计算机时32位还是64位

二者指的是什么意思

32位 - 32根地址线 - 物理线 - 通电 - 1/0

64位 - 64根地址线 - 物理线 - 通电 - 1/0

再通过电信号转换成数字信息:1和0组成的二进制序列

如果是32位

经过排列组合会有2^32次方个序列,这些序列都可以作为内存编号,而这些编号就可以被称为内存单元的地址

2.一个内存单元会占用多大的空间

我们可以通过假设法来猜测下

在32位操作系统下,已知可以有2的32次方个内存单元 ,也就是4,294,967,296个,假设每个单元占用1bit,那么经过转换,就会占用0.5GB的内存,管理的空间就会很小,而且一个bit就给一个地址,那么占用1个byte的char就会有8个bit也就是8个地址,太过于详细

经过研究讨论后,发现一个内存单元占用1个Byte是最好不过的

1
2
3
4
5
6
int main()
{
int a = 10;//a在内存中分配空间需要占用4个字节

return 0;
}

当我们想要知道a存储的地址时,可以选择 F10 - 调试 - 窗口 - 内存/监视,为了方便观察可以将列改成4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
int a = 10;//a在内存中分配空间需要占用4个字节
printf("%p\n", &a);//%p 专门用来打印地址的//但是发现每次的打印结果都不同
int * pa = &a;//pa是用来存放地址的,在C语言中pa就叫做指针变量
// * 说明 pa是指针变量
// int 说明pa执行的对象是int类型的

char ch = 'w';
char * pc = &ch;


return 0;
}

当我们知道a的地址之后,也是为了方便以后能够快速的找到a

1
2
3
4
5
6
7
8
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;//* 解引用操作符 *pa就是通过pa里面的地址,找到a
printf("%d\n", a);
return 0;
}

结果是20

指针变量的空间大小

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));

return 0;
}

发现结果都是一样的

为什么呢?

因为指针是用来存放地址的,所以指针的空间大小取决于地址的存储需要多大空间

但是这个结果会因为计算机的位数不同而不同

32位 32bit - 4byte - 一个地址

64位 64bit - 8byte - 一个地址

初识结构体

结构体是C语言中特别重要的知识点,结构体是的C语言有能力描述复杂类型

几条狗提也可以让C语言创建新的类型出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//创建一个学生
struct stu
{
char name [20];//成员变量
int age;
double score;
}
//创建一个书的类型
struct book
{
char name [20]:
int age ;
double score;
}
int main()
{
struct stu s = {"张三", 20 ,85.5};//结构体的创建和初始化
printf("1: %s %d %lf\n", s.name , s.age , s.score);//结构体变量.成员变量

struct stu * ps = &s;
printf("2: %s %d %lf\n", (*ps).name , (*ps).age , (*ps).score);//费劲

printf("3: %s %d %lf\n", ps->name, ps->age, ps->score);
//->作用: 结构体指针->成员变量名

return 0;
}