这是c语言的重中之重,对于许多数据结构与算法的实现,后续的结构体和数组,联合体这些都与指针有关,所以也希望大家能重视起来,这篇文章只是让大家已最简单的方式了解指针,后续对指针的详细介绍会在后续文章中写出(作者又在给自己挖坑了,而且不知道什么时候填坑)
想了解指针,应该先了解内存。
内存是计算机的存储器,这里扩展一下计算机的大概组成
计算机组成:控制器,运算器,储存器,输入设备,输出设备
计算机所有程序的运行都是在内存中的,所以内存在计算机也是尤为重要。
是16G的内存,但是内存这么大,计算机又是怎样使用的呢?
在使用前,计算机会把计算机的内存分为一个个小块,并且每一块给他取了一个名字,在使用的时候直接对接名字即可。用一个实际生活的例子来举例,每次你点外卖时,都会把自己的地址信息提供给外卖平台,这样外卖员在给你送外卖时得知了你是xxx区xxx学校的,这样就可以迅速的把外卖送到。
一整个内存被分配成很多个空间
这样就派生出来两个问题
*1、内存是如何编号的
*2、一个这样的内存单元站多大空间
这里还需要简单介绍一下计算机
在我们讨论计算机的时候应该有聊过32位和64位吧(当然现在应该都是64位的计算机了)
64位就代表了物理上有64根地址线,在计算机通电后会产生正负点,这样就产生了计算机的二进制位(电信号转化为数字信号),正点为1,负电为0
因为现在是为了让大家理解,,而且大家使用大多数编译器都是32位的(除去新的vs2022),所以就以32位来介绍
这样产生的32个二进制位就产生了从00000000000000000000000000000000~1111111111111111111111111111111111111111个数字
这些序列都作为内存的编号,当编号作为内从空间的代表时,我们就称作这些编号为捏村单元的地址。这样编写,我们的计算机就能管理2^32个内存单元,假设一个内存单元是一个bit位那么总共有4294967296个bit位
这个数字/8就代表了总共能管理的字节数
算出来应该是kb
算出来是512MB
再/1024,就是0.5GB
现在我们来看,这个内存算是非常小的了,所以一般计算机的内存分配也不会是这样分配的。
大家知道c语言最小的变量char类型占一个字节,一个字节就是8bit,那样就是8个地址,所以最终经过平衡后一个内存单元占一个byte(字节),用于分配地址
接下来就要正式的聊到指针了
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int a = 1;
return 0;
}
这样的一段代码,计算机就给a这个变量分配了四个字节的空间
接下来介绍一下查看a这个变量的地址,这里我们需要用到&,这是一个取地址符号,用于得到变量地址和%p作为输出
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int a = 1;
printf("%p", &a);
return 0;
}
得到的地址就是这个,但是&只会拿到这个变量第一个字节的地址,但是当我们需要存放这个地址的时候我们就需要一个变量去储存,这在c语言中就叫指针变量,a这个变量是int型,指向a的这个指针变量的类型位int*,&用于取出变量的直至
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int a = 1;
int* A = a;
printf("%p", &a);
return 0;
}
这个*代表了A是一个指针变量,Int代表了这个指针所指向的变量的类型是Int型
当然我们可以举一反三
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
char a = 'A';
char pa = &a;
return 0;
}
现在我来教大家如何使用这个指针
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int a = 1;
int* A = a;
printf("%p", &a);
return 0;
}
A这个指针是指向a所在的内存空间,如果我们想使用的时候应该这样
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int a = 1;
int* A = a;
*A = 10;//第三行
printf("%d", *A);
return 0;
}
第三行这个*代表的就是解引用操作,就是通过a的地址来找到a所在的内存空间,这里可以跑一下程序验证一下,这里我通过指针将a的值改为了10
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int a = 1;
int* A = &a;
*A = 10;
printf("%d", a);
return 0;
}
这里已经证明更改成功了
再来看一下最后一点指针类型的大小
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include
int main() {
int* a = NULL;
char* b = NULL;
printf("a的大小为%d", sizeof(a));
printf("b的大小为%d", sizeof(b));
return 0;
}
这里NULL代表了空指针,也就是不指向任何内存的一个指针,这样我们可以使用sizeof来计算一下空指针的大小
同理,其实实际上所有指针的大小都是相同的,都是四个字节,这是因为32位的编译器指针大小的是32个bit,所以计算出来是4byte.