c语言为什么叫c语言指针

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 18662 人关注过本帖
标题:指针用途大吗,有什么用
等 级:论坛游民
帖 子:22
专家分:20
结帖率:75%
&&已结贴√
&&问题点数:20&&回复次数:24&&&
指针用途大吗,有什么用
指针一直没看懂,感觉用指针和不用没什么区别,而且C语言老师说指针是嵌入式技术用的,我们软件的不用学,所以我想了解指针到底有什么用,用和不用的区别在哪
搜索更多相关主题的帖子:
等 级:青峰侠
帖 子:544
专家分:1790
指针没学就别说你学程序的
勤能补拙,熟能生巧!
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
学不学指针对你学程序,影响不大。现在都是面向对象,你懂得调用是没有问题。
p.s 程序无处不指针,在高级语言中只是你看不见.
小代码,大智慧
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
指针存在的理由确实有些怪异。
但就指针这个知识点而言,真的没有多大存在的必要性,因为它主要起到“间接引用”的作用,可以不必出现指针,直接引用相关的变量或数组元素就足够了。(这里我要声明,对于初学者而言,什么直接对内存访问啊、什么可以直接访问硬件接口啊等的问题都是没有什么意义的。)
但是,当楼主学习了函数之后,你就会发现,如果没有指针的存在,那么就无法实现“通过一个子函数更改其父函数中两个或两个以上的变量的值”的功能了。(这里我还要声明,对于学习C语言而非C++的初学者来说,“引用传递”的概念也是没有什么意义的。毕竟学习是有阶段性的。)
举例说明:
编写一个能交换两个变量的值的函数(任意指定的两个变量):
void Exchange(int, int);
void Exchange(int a, int b)
int main(void)
&&& int m,
&&& scanf(&%d %d&, &m, &n);
&&& Exchange(m, n);
&&& printf(&%d %d\n&, m, n);
相信楼主对这个例子应该很了解了,结果是,Exchange()函数没有实现交换两个变量的值的功能。
原因有3个:
1、C语言的函数具有“高度的独立性”:指C语言的函数所定义的局部变量(包括形参变量)只能在本函数体内被引用,不能被其他函数引用;而函数自己也不能调用其他函数的局部变量;
&&& 所以,不能通过直接修改“父函数”局部变量的方法实现前面所提到的功能。语法都无法通过。
2、C语言函数的返回值最多只有一个,所以不能通过同时返回两个或两个以上的值的方式实现前面所提到的功能。
3、C语言函数的实参与形参之间,只有“值传递”一种数据传递方法。这也就是说,形参变量(注意我这里将所有的形参全部看成是变量,根本没有数组等形式)的值,是实参表达式的值的“复制”版,因此,以后无论对形参变量进行什么样的更改,都不会更改实参表达式中相关变量的值。
由于存在上述严厉的现实,因此,要实现前面所说的功能,就只能依靠指针,进行“间接”更改了。
而这正是指针赖以存在的基本理由!
当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
等 级:蜘蛛侠
帖 子:486
专家分:1185
指针是C的精华啊,你没学指针约等于没学C语言
免费赠送河蟹一只
等 级:版主
威 望:20
帖 子:3554
专家分:80
学C 不会指针,那基本上废了.
樱花大战,&&有爱.
等 级:版主
威 望:20
帖 子:3554
专家分:80
指针是什么? 指针就是内存. 在有权限的情况下,提供你操作内存的手段.
樱花大战,&&有爱.
等 级:青峰侠
帖 子:687
专家分:1570
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
指针就是寻址
善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
等 级:论坛游民
帖 子:25
专家分:35
学好指针才叫学了c语言
版权所有,并保留所有权利。
Powered by , Processed in 0.059983 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved5分钟内了解C语言的指针
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了5分钟内了解C语言的指针,本文讲解了指针、引用和取值、void指针、NULL指针和未初始化指针、指针和数组等内容,需要的朋友可以参考下
指针、引用和取值
什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。本文会对上述所有指针类型进行探讨。
根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。
&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。
// 声明一个int指针
// 声明一个int值
int val = 1;
// 为指针分配一个int值的引用
// 对指针进行取值,打印存储在指针地址中的内容
int deref = *
printf("%d\n", deref);
第2行,我们通过*操作符声明了一个int指针。接着我们声明了一个int变量并赋值为1。然后我们用int变量的地址初始化我们的int指针。接下来对int指针取值,用变量的内存地址初始化int指针。最终,我们打印输出变量值,内容为1。
第6行的&val是一个引用。在val变量声明并初始化内存之后,通过在变量名之前使用地址操作符&我们可以直接引用变量的内存地址。
第8行,我们再一次使用*操作符来对该指针取值,可直接获得指针指向的内存地址中的数据。由于指针声明的类型是int,所以取到的值是指针指向的内存地址存储的int值。
这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。
void指针、NULL指针和未初始化指针
一个指针可以被声明为void类型,比如void *x。一个指针可以被赋值为NULL。一个指针变量声明之后但没有被赋值,叫做未初始化指针。
int * // int指针未初始化
int *nullptr = NULL; // 初始化为NULL
void * // void指针未初始化
int val = 1;
// void类型可以存储任意类型的指针或引用
printf("iptr=%p, vptr=%p\n", iptr, vptr);
// 通过显示转换,我们可以把一个void指针转成
// int指针并进行取值
castptr = (int *)
printf("*castptr=%d\n", *castptr);
// 打印null和未初始化指针
printf("uninit=%p, nullptr=%p\n", uninit, nullptr);
// 不知道你会得到怎样的返回值,会是随机的垃圾地址吗?
// printf("*nullptr=%d\n", nullptr);
// 这里会产生一个段错误
// printf("*nullptr=%d\n", nullptr);
执行上面的代码,你会得到类似下面对应不同内存地址的输出。
iptr=0x7fff94b89c6c, vptr=0x7fff94b89c6c
*castptr=1
uninit=0x7fff94b89d50, nullptr=(nil)
第1行我们声明了一个未初始化int指针。所有的指针在赋值为NULL、一个引用(地址)或者另一个指针之前都是未被初始化的。第2行我们声明了一个NULL指针。第3行声明了一个void指针。第4行到第6行声明了一个int值和几个int指针。
第9行到11行,我们为int指针赋值为一个引用并把int指针赋值为void指针。void指针可以保存各种其它指针类型。大多数时候它们被用来存储数据结构。可以注意到,第11行我们打印了int和void指针的地址。它们现在指向了同样的内存地址。所有的指针都存储了内存地址。它们的类型只在取值时起作用。
第15到16行,我们把void指针转换为int指针castptr。请注意这里需要显示转换。虽然C语言并不要求显示地转换,但这样会增加代码的可读性。接着我们对castptr指针取值,值为1。
第19行非常有意思,在这里打印未初始化指针和NULL指针。值得注意的是,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原因。最好的情况是你取到的是垃圾地址接下来你需要对程序进行调试,最坏的情况则会导致程序崩溃。
NULL指针被初始化为o。NULL是一个特殊的地址,用NULL赋值的指针指向的地址为0而不是随机的地址。只有当你准备使用这个地址时有效。不要对NULL地址取值,否则会产生段错误。
指针和数组
C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。
一个数组变量是一个常量。即使指针变量指向同样的地址或者一个不同的数组,也不能把指针赋值给数组变量。也不可以将一个数组变量赋值给另一个数组。然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。
int myarray[4] = {1,2,3,0};
int *ptr =
printf("*ptr=%d\n", *ptr);
// 数组变量是常量,不能做下面的赋值
// myarray = ptr
// myarray = myarray2
// myarray = &myarray2[0]
第1行初始化了一个int数组,第2行用数组变量初始化了一个int指针。由于数组变量实际上是第一个元素的地址,因此我们可以把这个地址赋值给指针。这个赋值与int *ptr = &myarray[0]效果相同,显示地把数组的第一个元素地址赋值到了ptr引用。这里需要注意的是,这里指针需要和数组的元素类型保持一致,除非指针类型为void。
指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址。与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型。
struct person {
struct person *
first.age = 21;
char *fullname = "full name";
first.name =
printf("age=%d, name=%s\n", first.age, ptr-&name);
第1至6行声明了一个person结构体,一个变量指向了一个person结构体和指向person结构体的指针。第8行为age成员赋了一个int值。第9至10行我们声明了一个char指针并赋值给一个char数组并赋值给结构体name成员。第11行我们把一个person结构体引用赋值给结构体变量。
第13行我们打印了结构体实例的age和name。这里需要注意两个不同的符号,'.' 和 ‘-&' 。结构体实例可以通过使用 ‘.' 符号访问age变量。对于结构体实例的指针,我们可以通过 ‘-&' 符号访问name变量。也可以同样通过(*ptr).name来访问name变量。
希望这份简短的概述能够有助于了解不同的指针类型。在后续的博文中我们会探讨其它类型的指针和高级用法,比如函数指针。
欢迎提出提问并给出评论。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2013年12月 C/C++大版内专家分月排行榜第二2013年12月 Linux/Unix社区大版内专家分月排行榜第二2013年11月 C/C++大版内专家分月排行榜第二2013年10月 C/C++大版内专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。如何理解c语言中的指针_百度经验
&&&&&&&&&电脑软件如何理解c语言中的指针
百度经验:我们在使用c语言进行编写程序的时候,就一定会使用上指针,指针的操作是编写程序的一个点。如何更好的使用指针,将是我们进行更好的书写程序的关键。这里,小编就分享一下自己在使用c语言编程过程中,对于指针的理解:1:指针是一个地址,指向的是个类型:我们知道,c语言中的类型有int,char,bool(这个不常用),一般我们使用int,char就可以满足一般的类型需求的,如果对于变量的长度过大,就是用long ,float,double,关于各个类型使用的的长度问题,可以使用sizeof(int)或者sizeof(long)来查看各个类型,在系统中的小。而指针就是一个8个字节(64系统)。2:指针指向的是地址,地址指向的是内容:我们需要一个变量,来存储地址,这个变量的值是地址,但是我们可以通过修改变量的值,来不断的改变地址,但是,我们如果需要改变该个地址的值的话,就需要,对地址的值进行修改,而不改变地址。int a = 10;int *p ;p = &a;*p =11;a=?这里我们看到,p 是一个变量,我们使用p来存储变量a的地址,这是,我们使用*p对于这个变量进行赋值,那么a的值最后,是多少呢,结果是11,因为我们使用*p赋值,就相当于a=11,赋值效果一样的。3:指针的指针,是面对于指针的变量:我们说,指针的指针的时候,就有点不清楚了,到底怎么区分指针和指针的指针呢。char *p;char **pr;pr = &p;我们这样看就清楚了一点,char *(*pr); *pr是一个存储的值为指针的变量,pr就是存储上个变量地址的变量。整合起来就是,pr是一个存储的值为指针的地址的变量。这样,我们就基本,对于指针有一个直接的了解了。经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。投票(153)已投票(153)有得(0)我有疑问(0)◆◆说说为什么给这篇经验投票吧!我为什么投票...你还可以输入500字◆◆只有签约作者及以上等级才可发有得&你还可以输入1000字◆◆如对这篇经验有疑问,可反馈给作者,经验作者会尽力为您解决!你还可以输入500字相关经验09301热门杂志第1期你不知道的iPad技巧3657次分享第1期win7电脑那些事6427次分享第2期新人玩转百度经验1318次分享第1期Win8.1实用小技巧2614次分享第1期小白装大神1828次分享◆请扫描分享到朋友圈

我要回帖

更多关于 c语言编程格式 的文章

 

随机推荐