C语言的精华——指针 指针初识

这是c语言的重中之重,对于许多数据结构与算法的实现,后续的结构体和数组,联合体这些都与指针有关,所以也希望大家能重视起来,这篇文章只是让大家已最简单的方式了解指针,后续对指针的详细介绍会在后续文章中写出(作者又在给自己挖坑了,而且不知道什么时候填坑)

内存

想了解指针,应该先了解内存。

内存是计算机的存储器,这里扩展一下计算机的大概组成

计算机组成:控制器,运算器,储存器,输入设备,输出设备

计算机所有程序的运行都是在内存中的,所以内存在计算机也是尤为重要。

当我们有一台电脑后都会有相应的内存,比如说我用的C语言的精华——指针 指针初识_第1张图片

是16G的内存,但是内存这么大,计算机又是怎样使用的呢?

在使用前,计算机会把计算机的内存分为一个个小块,并且每一块给他取了一个名字,在使用的时候直接对接名字即可。用一个实际生活的例子来举例,每次你点外卖时,都会把自己的地址信息提供给外卖平台,这样外卖员在给你送外卖时得知了你是xxx区xxx学校的,这样就可以迅速的把外卖送到。

用图来解释应该是这样C语言的精华——指针 指针初识_第2张图片

 一整个内存被分配成很多个空间

这样就派生出来两个问题

*1、内存是如何编号的

*2、一个这样的内存单元站多大空间

这里还需要简单介绍一下计算机

在我们讨论计算机的时候应该有聊过32位和64位吧(当然现在应该都是64位的计算机了)

64位就代表了物理上有64根地址线,在计算机通电后会产生正负点,这样就产生了计算机的二进制位(电信号转化为数字信号),正点为1,负电为0

因为现在是为了让大家理解,,而且大家使用大多数编译器都是32位的(除去新的vs2022),所以就以32位来介绍

这样产生的32个二进制位就产生了从00000000000000000000000000000000~1111111111111111111111111111111111111111个数字

这些序列都作为内存的编号,当编号作为内从空间的代表时,我们就称作这些编号为捏村单元的地址。这样编写,我们的计算机就能管理2^32个内存单元,假设一个内存单元是一个bit位那么总共有4294967296个bit位

C语言的精华——指针 指针初识_第3张图片

 这个数字/8就代表了总共能管理的字节数

再/1024C语言的精华——指针 指针初识_第4张图片

 算出来应该是kb

再/1024C语言的精华——指针 指针初识_第5张图片

 算出来是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语言的精华——指针 指针初识_第6张图片

 得到的地址就是这个,但是&只会拿到这个变量第一个字节的地址,但是当我们需要存放这个地址的时候我们就需要一个变量去储存,这在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;
}

C语言的精华——指针 指针初识_第7张图片 

这里已经证明更改成功了 

再来看一下最后一点指针类型的大小

#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来计算一下空指针的大小C语言的精华——指针 指针初识_第8张图片

 同理,其实实际上所有指针的大小都是相同的,都是四个字节,这是因为32位的编译器指针大小的是32个bit,所以计算出来是4byte.

你可能感兴趣的