目录
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知道它的地址,指针变量则是专门为存放地址而生
那么我们想要通过指针改变原本变量的数值,则是用到解引用操作符*
3.2>>指针类型是什么?
我们数据类型有int,char,long等等,那么指针类型是什么?
在上面这张图片中可以看到p的类型就是int*
而这张图片中指针的类型为char*,通过观察我们可以知道,指针的类型根据内容的类型确定,假设我们a是double型,那么指针则为double*,星号*代表这是一个指针变量 。
3.3>>指针变量占用空间
在x64操作系统中,指针变量的大小为8字节,x86操作系统中,指针变量大小为4字节。在Dev/C++编译器中,在箭头处修改操作系统位数。
这里能看到数值变成4(字节)了
这里需要注意指针变量的大小只跟操作系统位数有关,并不涉及类型大小
4>>指针变量类型的意义
4.1>>指针的解引用
指针解引用时需要注意指针的类型,最好和变量相同,否则易出现如下问题,只修改部分数值:
4.2>>指针+-整数
指针加减一个整数时,操作的是指针的地址,根据数据类型的大小进行加减,int类型就加减4
char类型则加1
5>>关于指针的运算
5.1const修饰指针
我们知道const修饰的变量它就会获得常量属性,变成一个常变量,那么我们修饰指针呢?该怎么修饰?别急,我们慢慢看:
通过以上两组实验我们可以发现,当const在*左边时,指针所指向的内容不能改变,当const在*右边时,指针的地址不能改变,这时肯定有人提出疑问,能不能两边都放?我的回答是当然可以,两边都放时,指针所指向的内容以及指针的地址都不能发生改变,否则就会报错。
5.2指针+-整数
在前面我们已经讲到了简单指针加减整数基本用法,现在我们把它放到数组中看看。我们首先需要知道数组中的元素地址是连续的。
这里通过指针的运算可以打印出数组里的每一个元素,因为数组中的地址是连续的,p又代表首元素地址,所以p+1就是下标为1的地址,p+2就是下标为2的地址,以此类推就能得出打印结果。
5.3>>指针减指针
指针-指针的绝对值可以得到一个指针到另一个指针之间的元素个数,但他们有一个运算前提,那就是指向同一个空间。
这里可以看到第一个元素到第十个元素之间有九个元素。这里可以用这张图帮助理解。
此时我们还可以通过指针来写一个统计字符串长度的代码:
#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;
}
这代码怎么做到的呢,不急,我们先要知道\0等于0等于假,字符串又是以\0为结束标志,那么我们就以*p为判断条件,每次不遇到\0就++,用于计数的c也进行++,当遇到\0时,为假跳出循环,范围计数c,我们就可以知道结果。
6>>总结
今天刚学指针的部分内容,此篇讲述了指针变量的取地址和解引用,指针变量的运算等等,以学习笔记的方式分享给大家,希望能得到大家喜欢,后续会持续分享指针内容,大家的三连是我持续更新的动力,谢谢大家啦!