初识指针の学习笔记

目录

 

1>>前言

2>>内存和地址 

3>>指针变量和地址

3.1取地址和解引用

3.2>>指针类型是什么?

3.3>>指针变量占用空间

4>>指针变量类型的意义

4.1>>指针的解引用

4.2>>指针+-整数

5>>关于指针的运算

5.1const修饰指针

5.2指针+-整数

5.3>>指针减指针

6>>总结

 

 

1>>前言

        今天我会分享一些我做的笔记,以及我对指针的理解, 后续应该会持续分享指针几天,毕竟指针的内容太多了,一天我也学不完,也分享不完,感谢大家理解,希望我的文章对大家有所帮助,谢谢!

2>>内存和地址 

        首先来了解什么是内存,以下来自百度(内存(Memory)是计算机的重要部件,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。)我们现在所使用的内存有8G、16G、32G,硬盘(外存)有128G、256G、512G,这就是内外存的区别。

还需了解内存中的转换:

1Byte=8bit(1字节=8比特位)

内存单位的编号——地址

C语言给地址取了一个新的名字——指针

所以内存单位的编号=地址=指针

还需知道创建变量的本质就是向内存申请一块地址空间

3>>指针变量和地址

3.1取地址和解引用

        取地址操作符是&,解引用为*,它们两个是一对,我们可以假设有一个变量a,可以通过&a知道它的地址,指针变量则是专门为存放地址而生

17c0beea330c49dca20f2af296fa87f0.png
那么我们想要通过指针改变原本变量的数值,则是用到解引用操作符*

e71479428c154ff9b87639c03f3bf5ba.png

3.2>>指针类型是什么?

        我们数据类型有int,char,long等等,那么指针类型是什么?

314f5ca89faa45808a60e76d1adc42da.png

在上面这张图片中可以看到p的类型就是int*

e11fe35d2f9d481a86b8269cea0c347d.png

而这张图片中指针的类型为char*,通过观察我们可以知道,指针的类型根据内容的类型确定,假设我们a是double型,那么指针则为double*星号*代表这是一个指针变量 。

3.3>>指针变量占用空间

        在x64操作系统中,指针变量的大小为8字节,x86操作系统中,指针变量大小为4字节。在Dev/C++编译器中,在箭头处修改操作系统位数。

3344f2cdf95745369055f32d07da04e8.png

这里能看到数值变成4(字节)了

这里需要注意指针变量的大小只跟操作系统位数有关,并不涉及类型大小

4bd6c506ecfa48b0aafc4c318a4e25c0.png

4>>指针变量类型的意义

4.1>>指针的解引用

        指针解引用时需要注意指针的类型,最好和变量相同,否则易出现如下问题,只修改部分数值:

0f61b2a321e24b2189dcd73d6cefbeb2.png

4.2>>指针+-整数

        指针加减一个整数时,操作的是指针的地址,根据数据类型的大小进行加减,int类型就加减4

2e74c311b93045d7bc43b05e1f439623.png

char类型则加1

6d3ef839b1a64bd5ac30b41958f08c8f.png

5>>关于指针的运算

5.1const修饰指针

        我们知道const修饰的变量它就会获得常量属性,变成一个常变量,那么我们修饰指针呢?该怎么修饰?别急,我们慢慢看:

131483fe34bd42099f3b4db5f8e276e4.png

3fe0597b294347b4b48160ffd35af437.png

通过以上两组实验我们可以发现,当const在*左边时指针所指向的内容不能改变,当const在*右边时指针的地址不能改变,这时肯定有人提出疑问,能不能两边都放?我的回答是当然可以,两边都放时,指针所指向的内容以及指针的地址都不能发生改变,否则就会报错。

5.2指针+-整数

        在前面我们已经讲到了简单指针加减整数基本用法,现在我们把它放到数组中看看。我们首先需要知道数组中的元素地址是连续的。

7174ae631c5f4300913ab47ed6c8401e.png

这里通过指针的运算可以打印出数组里的每一个元素,因为数组中的地址是连续的,p又代表首元素地址,所以p+1就是下标为1的地址,p+2就是下标为2的地址,以此类推就能得出打印结果。

5.3>>指针减指针

        指针-指针的绝对值可以得到一个指针到另一个指针之间的元素个数,但他们有一个运算前提,那就是指向同一个空间。

db9736e9f30342f1aa13013666333872.png

这里可以看到第一个元素到第十个元素之间有九个元素。这里可以用这张图帮助理解。

ce14247e4b18497daae3e53c63543e07.png

此时我们还可以通过指针来写一个统计字符串长度的代码:

#include<stdio.h>

int my_sizeof(char* p)
{
	int c=0;
	while(*p)
	{
		p++;
		c++;
	}
	return c;
}
int main()
{
	char arr[]={"abcdef"};
	int b=my_sizeof(arr);
	printf("%d\n",b);
	return 0;
}

9d67672bc51f4dc7a14e5c9ac4ff3079.png

这代码怎么做到的呢,不急,我们先要知道\0等于0等于假,字符串又是以\0为结束标志,那么我们就以*p为判断条件,每次不遇到\0就++,用于计数的c也进行++,当遇到\0时,为假跳出循环,范围计数c,我们就可以知道结果。

6>>总结

        今天刚学指针的部分内容,此篇讲述了指针变量的取地址和解引用,指针变量的运算等等,以学习笔记的方式分享给大家,希望能得到大家喜欢,后续会持续分享指针内容,大家的三连是我持续更新的动力,谢谢大家啦!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫の大一

谢谢大佬,我会三连你的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值