萌新的福利-C语言指针入门
Posted TangguTae
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了萌新的福利-C语言指针入门相关的知识,希望对你有一定的参考价值。
先来看一段百度百科的对指针的介绍
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
你们悟了吗?
相信大多数接触C语言的时候,觉得指针也太难理解了吧,我记得我本科C语言的老师上课就说过,C语言的精髓是指针,如果你学好了指针,可以说你C语言已经学的还不错了。
C语言中每个占据存储空间的实体(变量、数组、函数等)都会有一个地址,就好比日常生活中地址,你要去某个地方,只有知道地址了,才能找的到。计算机也是如此。而指针就是存储这些地址的变量。
在C语言中定义一个指针的方法是 类型+*+指针变量名,获得某个变量的地址采用取地址运算符&
int *p = NULL;
int a = 10;
p = &a;
在定义一个指针变量时,将指针变量初始化置空是一个好的编程习惯。
我们定义变量a的时候,会在内存(栈)上开辟一块空间,我们通过取地址符号得到存放a的空间地址,在32位的环境下,地址总共四个字节的大小(无论指针是什么样的类型),把这个地址给到我们的指针p,我们可以通过解引用的方式(操作符*)*p就可以访问这块内存空间。
看到这里会对指针有一点模糊的理解,C/C++中有大量对地址的操作,举个简单的例子,你想在命令窗获取一个数据,C语言中调用scanf函数
scanf("%d",&a);
他是把a的地址给scanf函数,把获取的值存入这个地址对应的空间里。
上面只是针对简单的变量,下面举一个数组的例子帮助大家更好的理解地址与指针的神奇之处
char arr1[]="abcdef";
char arr2[]="abcdef";
char* p_arr1=arr1;
char* p1 = "abcdef";
char* p2 = "abcdef";
数组中arr1、arr2是首元素的地址,所以我们访问这个地址*arr1,我们可以得到'a'这个字符。同样的我可以定义一个指针,把arr1赋值给这个指针,我们就可以通过这个指针访问这个字符串。
比如说我要得到数组中第三个字符'c',我们可以通过arr1[2]或者p_arr1[3]或者*(p_arr1+2)来获得,*(p_arr1+2)的意思是在首元素的地址上向后偏移两个字节(因为是char类型的指针,其他类型的指针就不是这样了,这个放在后面再讲),得到存放'c'字符的地址,并解引用。之所以可以这样访问是因为数组开辟的内存空间是连续的。
调试过程中0x0135fd6c为数组地址,第一个元素61是'a'对应的ASCII码值,后面以此类推。
数组arr1和arr2虽然存着相同的东西但是他们各自有各自的地址,是两块不同的空间
(地址和上面的不同是因为笔者重新调试,每次运行系统会分配不同的空间,不要疑惑)
但是将相同的字符串赋值给不同的指针,会有什么效果呢?
我们发现p1、p2竟然所指向的地址相同。
原因是字符串赋值给指针,其实是把字符串首元素的地址给指针存起来,但是这个字符串在哪里呢?字符串实际存储的空间在代码段(常量区),也就是说字符串是一个常量,对于常量不需要额外开辟空间存储同一数据,所以p1、p2指向的空间是相同的。为什么数组不是呢?数组定义的时候在栈上开辟空间,每次定义一个新的数组就会开辟一块新的空间,字符串赋值给数组时不是把地址给他,而是逐个的把数据赋值给数组。
怎么样看到现在是不是觉得地址指针是一个很复杂的东西,其实到后面学的越多,仔细理解会觉得指针是个非常有意思的东西。笔者未来会把指针相关的做一个系列,欢迎大家一起学习。
以上是关于萌新的福利-C语言指针入门的主要内容,如果未能解决你的问题,请参考以下文章