志在指尖
用双手敲打未来

c语言指针详解(c语言指针用法举例)

c语言指针详解

为什么需求指针?
指针解决了一些编程中基本的问题。
榜首,指针的运用使得不同区域的代码可以容易的共享内存数据。当然你也可以经过数据的仿制到达相同的作用,但是这样往往功率不太好,因为诸如结构体等大型数据,占用的字节数多,仿制很消耗功能。但运用指针就可以很好的防止这个问题,因为任何类型的指针占用的字节数都是一样的(依据渠道不同,有4字节或许8字节或许其他或许)。
第二,指针使得一些杂乱的链接性的数据结构的构建成为或许,比如链表,链式二叉树等等。
第三,有些操作有必要运用指针。如操作请求的堆内存。
还有一点:C语言中的全部函数调用中,实参传递给形参的机理都是“按值传递(passbyvalue)”,如果咱们要在函数中修改被传递过来的对象,就有必要经过这个对象的指针来完结。
指针是什么?
咱们指知道:C语言中的数组是指一类类型,数组详细区分为int类型数组,double类型数组,char数组等等。相同指针这个概念也泛指一类数据类型,int指针类型,double指针类型,char指针类型等等。
通常,咱们用int类型保存一些整型的数据,如intnum=97,咱们也会用char来存储字符:charch=’a’。
咱们也有必要知道:任何程序数据载入内存后,在内存都有他们的地址,这便是指针。而为了保存一个数据在内存中的地址,咱们就需求指针变量。
因而:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
为什么程序中的数据会有自己的地址?
弄清这个问题咱们需求从操作系统的角度去认知内存。
电脑维修师傅眼中的内存是这样的:内存在物理上是由一组DRAM芯片组成的。
而作为一个程序员,咱们不需求了解内存的物理结构,操作系统将DRAM等硬件和软件结合起来,给程序员供给的一种对物理内存运用的笼统。这种笼统机制使得程序运用的是虚拟存储器,而不是直接操作物理存储器。所有的虚拟地址形成的集合便是虚拟地址空间。
在程序员眼中的内存应该是下面这样的。(假设运用的是32位系统渠道,虚拟存储空间为4GB)
也便是说,虚拟存储器是一个很大的,线性的字节数组(平整寻址)。每一个字节都是固定的大小,由8个二进制位组成。最要害的是,每一个字节都有一个仅有的编号,编号从0开端,一向到最后一个字节。如上图中,这是一个4GB的虚拟存储器的模型,它一共有4x1024x1024x1024个字节,那么它的虚拟地址范围便是0~4x1024x1024x1024-1。c

c语言指针用法举例

小白在C语言的学习过程中遇到的最头疼的知识点应该便是指针了,指针在C语言中有非常大的用途。下面就由我带着问题来写下我关于指针的一些了解。
指针是什么?
指针自身是一个变量,它存储的是数据在内存中的地址而不是数据自身的值。它的界说如下:
intx=10,*p;
p=&x
intx=10;
int*p=&x;
首要咱们能够了解int*这个是要界说一个指针p,然后由于这个指针存储的是地址所以要对x取地址(&)将值赋给指针p,也便是说这个指针p指向x。
很多新手都会对这两种界说方法感到迷惑,其实他俩的意思是相同的。第一种界说方法界说了int型的变量x和指针p,然后将x的地址赋给p。第二种是在界说指针p的一起将x的地址赋给指针p。咱们姑且了解为”int*”是界说指针的标志。
指针有什么用?
这样咱们就能够通过*p来找到指针所指向的变量x的地址,然后对地址中的值(值是10)进行操作。
//接着上面的代码
printf(“%p”,p)//成果是一个地址(p指向的变量a的地址)。
printf(“%d”,*p)//成果是10,变量x的值。
printf(“%d”,&p)//成果是一个地址(指针p的地址,由于指针也是一个变量自己也有地址的)
数组名和指针的差异?
数组名是一个地址,它能够被了解为一个常指针(它只能指向本数组首元素的地址)。而指针能够指其他的变量等等。
intstr[5]={1,2,3,4,5};
int*p=str;
printf(“%d”,*p);//输出为1,数组的首元素。
printf(“%d”,*str);//输出为1,数组的首元素。
printf(“%d”,str[0]);//输出为1,数组的首元素。
printf(“%p”,p);//输出为地址,数组的地址。
printf(“%p”,str);//输出为地址,数组的地址。
printf(“%d”,*(p+1));//输出为2,数组的第二个元素。
printf(“%d”,*(srt+1));//输出为2,数组的第二个元素。
对照代码咱们能够很明晰的看到数组名在对内存中存储的数据进行操作的方法和成果是相同,可是数组名存储自己数组自身的首地址。
什么是空指针,野指针?
在函数内部对指针进行赋值操作后,在函数执行完毕后,该指针就成了一个空指针(变量从栈中弹出)。可是通过动态地址分配(堆空间)的指针不会有上述问题。
free(p)后开释内存的指针为野指针。
关于const关于指针的约束问题:
inta=10,b=20;
int*constp=&a;//无法使p指向其他地址。
p=&b;//这样的操作是不允许的。
*p=20;//能够这样操作。
constint*p=&a;//p能够指向其他地址。
p=&b;//能够操作。
*p=10;//操作不被允许。
constint*constp=&a//p不能指向其他地址,也不能改动地址中的值。
p=&b;//操作不被允许。
*p=20;//操作不被允许。
const在int的左面那便是不能修正地址中的值,在右边便是不能指向其他地址,左右都有那便是既不能修正地址的值也不能指向其他地址。
小白常出现的问题我个人总结了上述几点,如果有错误的当地期望咱们留言交流互相学习。后边会写下多维数组的存储方式和指针的问题。
下面简单介绍下c语言指针的几种用法;
1、指针指向变量:
下面有这样一个代码块:
intmain()
{intx=10;intb=15;test(x,b);printf(“x=%d,b=%d\n”,x,b);}
voidtest(inta,inty)
{inttmp;tmp=a;x=y;y=tmp;}
最终输出的成果还是x=10,b=15。由于在函数调用时,实参和形参之间仅仅值传递。但咱们运用指针成果就不相同了,如:
intmain()
{intx=10;intb=15;test(&x,&b);printf(“x=%d,b=%d\n”,x,b);return0;}
voidtest(int*a,int*y)
{inttmp;tmp=*a;*a=*y;*y=tmp;}
输出成果x=15,b=10。变量a和b的值发生了交换。这是由于咱们使用指针拜访变量的存储单元,直接修正动量的值。
2、指针指向数组:
界说一个数组并初始化,intarray[5]={2,5,12,7,8},界说一个指针变量并把数组的地址赋给它,int*p=array,注意数组名便是数组的地址,并且数组的地址便是首元素的地址。因此咱们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素5,因此咱们能够使用指针来遍历数组的各个元素:
intmain()
{intarray[5]={2,5,12,7,8};int*p=array;for(inti=0;i<5;i++){printf(“array[%d]=%d\n”,i,*(p+i));}return0;}
3、指针指向字符串:
咱们都知道用数组存储字符串,如charname[20]=”jack”,上面已经简单叙述了指针指向数组,所以咱们能够这样做,char*name=”jack”,指针变量指向字符串的首个字符并能够顺次拜访字符串的各个字符。
4,指针指向函数:
咱们需要知道怎样表示一个指针指向函数,说白了便是语法要正确,下面我也取一个代码块来阐明一下:
intsum(intx,inty)
{returnx+y;}
intmain()
{inta=5;intb=6;int(*p)(int,int);p=sum;intresult=(*p)(a,b);printf(“Theresultis%d\n”,result);return0;}
不难发现上面代码块里句子(*p)(a,b)能够用p(a,b)来替代,由于p和sum便是相同的,仅仅用前者可能更简单了解一点。而咱们要知道怎样界说一个指针指向函数,int(*p)(int,int)这是固定写法,前面的int是指针将来指向的函数的返回值的类型,如果没有函数返回值,那便是void,后边括号里的两个int当然便是指针将指向的函数的形参。指针指向函数用起来确实有点抽象,要想娴熟运用的话就多去做一些这方面的操练吧!
5,指针指向结构体:
咱们首要首要界说一个结构类型:
structstudent
{
char*name;
intages;
};
再根据类型界说结构体变量structstudentstu={“Rose”,15};界说一个指针指向结构体类型,structstudent*p;把结构体变量stu的地址赋给指针变量p,p=&stu;咱们能够有3种方式来拜访结构体中的特点ages:
stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。
综上所述,指针的基本用法便是这几种,还有些用法不常见的小编在此就一一例举了,有兴趣的话能够去翻阅相关的材料。
————————————————
版权声明:本文为CSDN博主「有可为编程」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45446903/article/details/97403468

未经允许不得转载:IT技术网站 » c语言指针详解(c语言指针用法举例)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载