c语言指针用法举例?C语言指针的用法
- 软件开发
- 2023-09-19
- 56
大家好,今天来为大家解答c语言指针用法举例这个问题的一些问题点,包括C语言指针的用法也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解...
大家好,今天来为大家解答c语言指针用法举例这个问题的一些问题点,包括C语言指针的用法也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
c语言指针怎么用
1.指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;
2.C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;
3.C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。
C语言指针到底是什么,该怎么用呢
在C语言中我们可以认为指针就是地址,不过是某一个具体内存单元的地址。
如我们在c语言中定义了一个int型变量a:
inta;
那么计算机就会给a分配4个字节的地址(在vc++中,在某些版本的c语言中,可能是2个字节)来存放a的值。由于在内存中每个字节都有一个地址,那么哪个地址是a的地址呢?我们不能同时用4个地址来表示a的地址吧,所以在c语言中,我们拿这块空间(4个字节)的第一个字节的地址当作变量a的地址,也就是首地址。
然后我们在定义一个指针变量,如:
int*p;
再用取地址运算符把a的首地址取出来赋值给指针变量p,如:
p=&a;
现在指针变量p里存放的就是a的地址,我们就称p是a的指针。
c语言指针的思想
基本概念与理解指针是C/C++编程语言中的重要概念,但是对于初级程序员来说,指针是个比较难理解的概念,下面就从指针的概念入手,一点点解密指针。学习并理解指针首先已经具备基本的编程知识,能够编写C程序,对于变量知道如何定义并进行运算。
c语言指针有什么用
C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:
1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;
2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等。
3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。
C语言中指针问题
题主的这个问题很有代表性,是很多初学C语言的同学经常会搞混的一个知识点,啥知识点?就是传说中鼎鼎有名的“传值”和“传址”,就这一字之差,却搞得多少英雄好汉竞折腰。
我是石家的鱼,从事C语言答疑解惑的工作,下面我来回答下题主的问题,题主和后来的小伙伴们看看还难不难。小伙伴们有什么问题,或者有不理解的地方,欢迎在评论区与我互动哦!
本回答原创,欢迎转载。不过转载时请注明作者和出处,谢谢!
1、main函数我们先来看main函数。在main函数中,定义了一个变量z。变量z会被保存在内存中,我假设变量z在内存中的地址是0X123。0X123是16进制,至于我为何不用10进制来表示变量z的地址,我只想说,不要拘泥于这种细节嘛!
变量z没有初始值,在内存中保存的示意图如下:
我在示意图中画了一个问号,意思就是变量z还没有一个值。
在main函数中调用了my_power函数,并且这个函数的参数是“&z”,也就是变量z的地址:0X123。题主的意思是想在my_power函数中给变量z一个值。下面,我们就来看看第一个my_power函数。
2、第一个my_power函数好,现在整个程序进入了第一个my_power函数。第一个my_power函数啊,它有一个指针类型的参数:mypower。也就是说,整个程序在进入第一个my_power函数时,系统创造了这个指针变量mypower,注意“创造”这个词语,我用粗体表示了。这个指针变量mypower接收main函数传来的变量z的地址:0X123,那么此时指针变量mypower就指向了main函数中的变量z。如下图所示:
继续看第一个my_power函数。在这个函数中,又定义了一个变量z,只不过这个z是属于第一个my_power函数的。在进入第一个my_power函数时,系统也创造了这个只属于第一个函数my_power的变量z,只不过这个z的地址就不是0X123了,而是另外一个16进制的值,我假设是0X456,如上图所示。在上图中,我在属于第一个my_power函数的变量z下画了一个问号,意思就是在执行第一个my_power函数的“z=pow(x,y);"语句之前,属于第一个my_power函数的变量z没有值。
好了,现在执行第一个my_power函数的“z=pow(x,y);"语句。执行之后,我假设属于第一个my_power函数的变量z的值是1,再执行下面的”mypower=&z;"语句之后,示意图就变成如下这个样子:
看到了吗同学们?此时第一个my_power函数的指针变量mypower指向了属于第一个my_power函数的变量z!天啊!我再强调下,此时第一个my_power函数的指针变量mypower,本来是指向属于main函数的变量z,现在指向了属于第一个my_power函数的变量z!
也就是说,截至到第一个my_power函数全部执行完毕,属于main函数的变量z的值还是没有,我还是用问号标记。而那个属于第一个my_power函数的变量z的值,已经是1了!
OMG!
这还不是重点。重点是,第一个my_power函数全部执行完毕后,系统会“杀掉”属于第一个my_power函数的指针变量mypower和变量z,如下图所示:
我用叉号来表示当第一个my_power函数全部执行完毕后,系统销毁了指针变量mypower以及属于第一个my_power函数的变量z。
此时整个程序又回到了main函数,但是属于main函数的变量z呢?它的值还是没有,还是一个问号。所以题主你看,main函数中最后的printf语句输出的变量z的值是一个莫名其妙的值,是不是?
3、第二个my_power函数好,我们再看整个程序进入的是第二个my_power函数。第二个my_power函数也有一个指针类型的参数:mypower。也就是说,整个程序在进入第二个my_power函数时,系统也创造了这个指针变量mypower。这个指针变量mypower也会接收main函数传来的变量z的地址:0X123,那么此时指针变量mypower也指向了main函数中的变量z。
好了,现在执行第二个my_power函数的“*mypower=pow(x,y);"语句。执行之后,我还是假设pow(x,y)这个函数返回一个值是:1。这个1给了*mypower,也就是给了属于main函数的变量z,示意图如下:
从示意图可以看出,第二个my_power函数的指针变量mypower指向了属于main函数的变量z,而且这个z的值是:1.
第二个my_power函数全部执行完毕后,系统会“杀掉”属于第二个my_power函数的指针变量mypower,如下图所示:
我还是用叉号来表示当第二个my_power函数全部执行完毕后,系统销毁了指针变量mypower。但是,注意我的这个但是,属于main函数的变量z,没有被系统杀死,没有被系统销毁,它安安静静地霸占着0X123这个地址,图中我用勾号来表示。整个程序回到了main函数,main函数一看,哟,我的变量z的值这次对了啊,好开心啊啊哈哈哈!所以main函数最后的printf就输出正确的变量z的值。
4、回味一下题主,各位小伙伴,看出什么了吗?再仔细地慢慢地回味一下。C语言里好多的东西只可意会,不可言传。
小伙伴们还有什么问题,或者有不理解的地方,欢迎在评论区与我互动哦!
C语言指针到底有什么用
所有变量值保存在内存中,而每个内存都有一个地址,所谓地址就是一个整数编号,如同门牌号码用于定位(专业术语叫寻址),一个地址对应一个字节(8bit)的内存单元。
如今的编译器,一个整数int类型的值占用32位bit,也就是4字节,编译器将第一个字节的编号定义为该整数的地址,由于保存地址的变量就像一个箭头指向某地址,而称为指针变量。
inta=10;//定义一个整数变量a,对其赋值10
int*p=&a;//定义一个指针变量p,对其赋值a的内存地址,&符号意思为引用跟随其后的变量地址。
cont<<a<<end;//输出a的值:10
cont<<p<<end;//输出p的值:XXXXX其实为a的地址,该地址由编译器和运行时确定。
cont<<*p<<end;//输出p指向的地址中的值:10,也就是a的值,*星号放在变量前面意思就是取该变量中的地址所指内存中的值。
读取过程为:p的值(a的地址)->寻址->取值
由于指针是一个变量的首个字节的地址,所以要告诉编译器被指地址包含连续多少个字节,因此指针也有类型。比如上面例子中声明了p指针是个整数指针,这样编译器知道p指向一个4字节的内存块。
你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。
在C/C++中很灵活,但是也很危险,也很难学,如果指针指向错误的地址会引起程序崩溃,因此在C#中已经被微软封装了,但内部还是有指针的。
如果有必要,C#中也可以使用指针,使用非安全代码,在项目生成选项卡中勾选“允许非安全代码”,然后就可以使用指针了,不过不建议这么做。
unsafe
{
inta=10;
int*p=&a;
}
好了,关于c语言指针用法举例和C语言指针的用法的问题到这里结束啦,希望可以解决您的问题哈!
本文链接:http://www.xinin56.com/ruanjian/27748.html