从0开始学c语言-09-指针及指针大小、*、&、地址

发布于:2023-01-04 ⋅ 阅读:(600) ⋅ 点赞:(0)

本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。

下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。

上一篇

从0开始学c语言-08-认识一下关键字、#define定义常量和宏_阿秋的阿秋不是阿秋的博客-CSDN博客

总结篇

从0开始学c语言-总结01-c语言的粗略认识和快捷键_阿秋的阿秋不是阿秋的博客-CSDN博客

目录

 

指针

先明白内存的储存方式

不同数据的地址怎么分配内存单元

现在教你怎么看地址

 阿偶!地址怎么和上面的不一样呢?

把&去掉

创建一个char类型的试试看

和int类型进行对比。

 代码中指针怎么用?

计算一下各种指针的大小

 总结


指针

先明白内存的储存方式

我们可以把内存理解为一个空间,而这个空间里住着很多数据。比如说你要找一个数据,如果没有它的编号或者地址就要一个个筛选,效率很低。

为了提高效率,我们把内存划分成了一个个内存单元,并且给每个单元进行了编号,也就是地址。

那么数据太多的话,如何进行编号便成了个问题。

这就需要联系到我们的计算机本身了,有的是32位系统,有的是64位系统。

我们需要知道的是32位系统——32根地址线——32根物理线——通电——1(正电)/0(负电)——会有多少个编号呢?

 我们把电信号转换为数字信息:0和1组成的二进制序列,这就是编号的组成。

还有一个问题:一个内存单元有多大?

内存的空间有限,如果为了划分更细致的话,我们假设一个内存单元是1bit,那么1个char类型的数据就需要1个字节也就是8个bit——8个内存单元——8个地址。(不要以为一个内存单元对应一个数据,人家数据还分大小的,一套房子不够住!)

整个内存的大小也就是2的32次方个bit,换算等于0.5个gb,这实在是太小了!

所以我们把一个内存单元划分了一个字节的大小。

指针就是个变量,用来存放地址。

 

不同数据的地址怎么分配内存单元

int main()
{	
	int a = 9;  //int类型的数据a单位大小是4个字节,占了4个内存单元
	printf("%p\n", &a);  //%p是打印地址的,&a是取a的地址
    return 0;     
}

现在教你怎么看地址

首先进行调试(fn+f10),然后这么点。

调出来这个窗口后,可以拖动到合适的位置,就像这样。

 

 

 我们调成4,就可以看到a是怎么储存的了。

需要明确的是,我们在取地址的时候只取4个字节中第一个字节的地址,也就是最小的那个地址。

小白可能不懂地址怎么出来的,这些地址是32bit的二进制序列转换后的十六进制,联系一下我们之前讲的编号怎么编的,你就知道地址怎么来的了。

现在我们进行打印。

 阿偶!地址怎么和上面的不一样呢?

这里就需要强调了:地址会变,因为有生命周期,每次创建再销毁,随机分配的。

把&去掉

我做了个新尝试,把&去掉,发现直接打印出来了a在内存单元中储存的样子。

 这样打印会有警告,

 不是很理解,但是很有趣。以后再探讨吧。

创建一个char类型的试试看

 

 观察箭头和红色的地方。

 

 

 可以看到,进行打印后,41(内存单元中储存的样子)是不会变的,而地址是会变的。

和int类型进行对比。

 

 这里是红了4个内存单元。

 

和char类型结论一样,内存单元中储存的样子是不会变的,而地址是会变的。

 代码中指针怎么用?

int main()
{
	int a = 9;
	int* qiu = &a;
	*qiu = 778;  //*qiu通过qiu的地址找到a,*是解引用操作符
	printf("%d\n", a);     //这输出的值便是通过*qiu来改变了a的值  
	printf("%d\n", qiu);   //我们在定义的时候int*是代表一个整型指针变量类型的数据,所以用这个%d会警告,且打印出来是个随机值
	printf("%d\n", *qiu);  //这样打印就可以输出正常的数值

	printf("%p\n", &a);     //前两个地址不一样
	printf("%p\n", &qiu);
	printf("%p\n", &*qiu);  //这个才是一样的地址

	return 0;
}

仔细观察这些代码的不同之处。

 那么事实证明qiu只是个指针变量名字*qiu才是和a一样的。

计算一下各种指针的大小

int main()
{
	
	printf("%d\n", sizeof(char*)); 
	printf("%d\n", sizeof(short*)); 
	printf("%d\n", sizeof(int*)); 
	printf("%d\n", sizeof(long*)); 
	printf("%d\n", sizeof(long long*)); 
	printf("%d\n", sizeof(float*)); 
	printf("%d\n", sizeof(double*));   //和系统有关

	return 0;
}

 指针的大小取决于地址存储的需要。

(注意!!!!我这里图画错了,应该是qiu,qiu才是指针,那个存地址的指针)

 

 总结

 1.电信号转换为数字信息:0和1组成的二进制序列,这就是编号的组成。

2.指针就是个变量,用来存放地址

3.只取4个字节中第一个字节的地址

4.地址会变,因为有生命周期,每次创建再销毁,随机分配的。

5.内存单元中储存的样子是不会变的,而地址是会变的。

6.qiu只是个指针变量名字*qiu才是和a一样的

7. 指针的大小取决于地址存储的需要

下一篇

从0开始学c语言-10-结构体以及一些作业_阿秋的阿秋不是阿秋的博客-CSDN博客

总结篇

从0开始学c语言-总结01-c语言的粗略认识和快捷键_阿秋的阿秋不是阿秋的博客-CSDN博客

本文含有隐藏内容,请 开通VIP 后查看