C/C++知识点之C语言学习之路——指针初探
小标 2018-11-12 来源 : 阅读 856 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言学习之路——指针初探,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言学习之路——指针初探,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

进来学习C语言碰到了指针,着实学了一段时间,搞不出个头绪,今日感觉有些眉目,来此做个记录,也望能给困顿的人一起分享下感悟。

学习指针还要从变量,数组,函数的定义这些基础说起。

如:int a=10;

int a[]={1,2,3,4};

int max (int x,int y)

{

....

}

学习C语言指针我想指针变量的定义就不用说了吧。

先上一个例子然后再给大家一一展开进行讲述。

#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("a=%d",a);
}

哈哈,大家是不是嫌这个例子太简单了,哈哈,看官还请休要怪罪,就是这么一个小小的例子就是学习指针的切入点,scanf("%d",&a),这句是什么意思,我想大家肯定已经知道了就是从键盘输入中读取一个整数,然后赋值给a,不错,就是如此,但是为什么&a呢,声明变量a,系统在空间中开辟一个整数空间,具体占据多少字节要根据编译器和系统来定,&a,表示的就是这个地址空间的地址,scanf("%d",&a);其实是将读取进来的整数放进了该地址空间内,a只不过是该地址空间的一个比较友好的代称。指针的名字也是一种友好的代称,只不过这种代称指向的是地址而已。那既然&a表示的是变量a的地址,那一定可以赋值给指针变量喽。我们对上面的例子稍作修改。

#include<stdio.h>
int main()
{
int a;
int * p=&a;
scanf("%d",p);
printf("a=%d",* p);
}

这段代码与上面多讲的例子运行结果一模一样,p就是指针变量,把a的地址赋值给p,那p所代表的也就是a的地址空间了。将所读进来的整数放进p,还是放进&a,其实是同一个地方,只是名字不同而已。现在想来,指针的一切其实都是在这个例子上的变通。

int a;开辟的是一个单独的地址空间,那数组啦,函数啦,字符串啦那开辟的就是一串连续的地址空间。而那些友好的名字表达的就是地址的初始值而已。

来接着给大家上栗子:

#include<stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int * p=a;
printf("a[1]=%d\n",* (p+1));
}
大家可以试一下看一下会有怎样的输出,我可以偷偷的告诉大家是‘2’,哈哈。为何呢?上面说了a代表的其实是一个数组的首地址,把首地址赋值给指针变量p,那么p+1表示自然就是a[1]地址,那为何是+1呢?哈哈,这个是你告诉编译器的啊,把指针变量声明为int型,那自然1代表的就是一个int型数字所占的一个地址空间啦。

大家慢慢消化练习,接着给大家再上一个栗子,指针指向多维数组,说实话这个确实使我懵圈了好长一段时间,多维数组,数组名表示的也是一个起始地址,不过他怪就怪在他的多维度。

还是先个大家上个例子。

#include<stdio.h>
int main()
{
int a[][3]={1,2,3,4,5,6,7,8,9};
int * p=a[0];
int (* p1)[3]=a;
printf("a[1][1]=%d\n",* (p+4));
printf("a[1][1]=%d\n",* (* (p1+1)+1));
}

这个大家可能猜到会输出什么呀,我再次偷偷的告诉大家输出两个5,不知道你看到这个例子有没有懵,反正当时我是懵了,不急,一点点 把它拨开比较差异自然也就懂了,首先两个指针的赋值,其实这里两个赋值是一样一样的,a,a[0],所表示的都是这个二维数组的首地址,只不过这两个指针不同,所以在用起来也就有一定的差异性,指针p仅仅是一个地址,一维的,程序在存储二维数组时其实也是按序存储的,也是一个一维的数据,所以指针p代表的是这个数组的起始地址,那么+1自然也就是依次往后进行遍历了,如果我把指针p的定义成 int * p=a[1],那程序该作何输出呢,哈哈这个我就不跟大家说了,可以自己进行操作,看一下,然后再进行分析为何,在这里提醒大家一点,a[0]表示的是第0行的首地址,那么a[1]表示的自然就是第一行的首地址啦,就到这,大家自己思考吧。然后是指针p1的赋值,后面有个[3],咦。。。这可了不得,它想干嘛,哈哈,它不想干嘛,它是觉得它能力大,想多分担点,它告诉编译系统说,我可以一下子存放三个地址,那它也就是个二维的概念啦,正好和咱们定义的二维数组一样,* (p1+1)表示就是第1行的首地址,然后再+1 (* (p1+1)+1),就是在这个一维数组中往后遍历一个啦,也就是第一行第一个元素的值(从0开始数)。这个地方我觉得不好理解消化,还是多做些练习慢慢思忖才能领悟。

再给大家上个栗子:

#include<stdio.h>
int main()
{
char * a[3]={"good study","day day up","c program"};
printf("a[1]=%s\n",a[1]);
}

这个会输出什么呢?这个例子可以体现指针数组的灵活之处,它可以存放长短不一的数据,其实表面看来它存放的是长短不一的数据,但其实它存放的是这些长短不一数据的首地址,大家请看:

#include<stdio.h>
int main()
{
char str[]="good good study";
printf("str=%s\n",str);
}

大家明白了这个也就知道上面的指针数组是怎么一回事了,
char * a[3]={"good study","day day up","c program"};其实是str1[]="good good study",str2[]="day day up",str3[]="c program",char * a[3]={str1,str2,str3},这些操作的集合。指针数组这样分开来看也就没那么复杂啦。


再来一个例子,哈哈,这个例子不得了,我觉的这个例子是最体现指针类型灵活性的地方。

#include<stdio.h>
int max(int x,int y)
{if (x>y) return x;
else return y;
}

int min(int x,int y)
{
if (x>y) return y;
else return x;
}

int fun(int x,int y,int (* p)(int a,int b))
{
int result;
result=(* p)(x,y);
printf("result=%d\n",result);
}

int main()
{
int max(int x,int y);int min(int x,int y);int fun(int x,int y,int (* p)(int a,int b));
int x,y,i;
scanf("%d %d",&x,&y);
printf("choice the fun:\n1:max\n2:min\n");
scanf("%d",&i);
if (i==1) fun(x,y,max);
else fun(x,y,min);
return 0;
}

这个例子比较长但是很简单,大家耐心看肯定看得懂,我在此想说的是,函数在程序中也是一个连续的地址空间所以也可以用指针变量进行表示。



(stdlib.h  void * malloc(unsigned int size);void * calloc(unsigned n,unsigned size);void free(void * p);

main函数原型int main(int argc,char * argv[]))这个是我自己用来做记录用的大家不用留意。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程