首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

就学C的大牛给解释下~

2012-06-20 
求学C的大牛给解释下~~~本菜鸟刚学C语言没多久,对里面的指针感到有些迷惑,取一个变量的值:通过变量标识取

求学C的大牛给解释下~~~
本菜鸟刚学C语言没多久,对里面的指针感到有些迷惑,  
取一个变量的值: 通过变量标识取值、通过指针取值、通过指针变量取值 这三者有什么区别?
还有我看到网上很多说运用指针:1、很效率、写出来的代码简洁。我想知道为什么指针效率(最好举个例子~~谢谢)  



望大牛们多多指教,只要对我有用的我都会给分(重要的是知识的交流~~)!!!!!!!

[解决办法]
指针是一种特殊的变量类型。内部存放的是其指向内容的地址。
比如:int a,*p; p = &a;那么p的内部的值是a的地址。p指向了a。通过解引用(*)可以获得a的值。
[解决办法]
这个和汇编有关系了, 涉及到变量寻址, 最高效的寻址方式是寄存器直接存取, 比如申明变量的时候用register指定, 但是由于寄存器资源太少, 这种方式就不能多用, 另外就是内存寻址, 内存寻址分为很多种, 按效率有(不完全)直接寻址,如 直接定义变量 int a = 10;另外就是间接寻址, 就是通过指针的方式, 通过这里可以看出指针并不是最高效的寻址方式, 只不过它非常灵活, 由指针可以扩展到其它很多寻址方式, 如相对便宜寻址, 一次, 二次, 三次。。。间接寻址 意味着访问变量的方式非常多样。 这对编程来说非常重要, 直接影响到函数的参数传递和返回值, 采用指针就避免了内存拷贝, 从这个角度它是高效的, 所以说它的高效是和函数结合起来说的, 举个例子 如下
struct Type
{
char str[1000000];
}
int foo(struct Type type); 
int foo(struct Type *pType);
比较这两个函数, 第一个在传递参数的时候, 要拷贝1000000个字符, 而第二个则拷贝几个字节就够了
[解决办法]
没啥可解释的
所有数据都存放在内存中,每个数据在内存中都占据一定的位置和空间,这个位置就叫做该数据的地址,而这个空间内的二进制内容就叫做这个数据的值
指针也是一个数据,但它的值是另一个数据的地址,仅此而已

明白了本质,自己实际编几个程序单步调试一下,就一切OK
至于几个说法之间的区别——说实在的,这种咬文嚼字的行为很危险,特别是你不幸手持一本垃圾教材的时候

至于指针效率高,那是因为指针是底层的东西,可以做到很多优化
例如很多时候,传递大量数据不需要复制全部数据,只需要将该数据的首地址和大小复制过去即可
[解决办法]
既然学C的都知道我说的东西,那我就不多说什么了
虽然我觉得这些基础知识就足够理解指针了,再深入就该学编译原理了
[解决办法]
例如打印字符串的每一个元素:
char *str = "abcdefghi";
方法一:
for (int i = 0; i < strlen(str); i++)
printf("%c", str[i]);//每次用首地址str加上i(0到8)
方法二:
char *p = str;
while ('\0' != *p)
{
printf("%c", *p);
p++;//p每次加1
}
这里字符串str越长,用指针的效率就越明显

[解决办法]

探讨

引用:

既然学C的都知道我说的东西,那我就不多说什么了
虽然我觉得这些基础知识就足够理解指针了,再深入就该学编译原理了



我没有别的意思,我的意思是学C的都从书本或者别的途径知道“C运用于最底层”这句话,但具体的原理不懂~~~(C为什么可以接触系统底层,譬如java、C#等为什么不可以,它们之间的区别),还希望你能够指教下!

[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
我想你观察的很仔细
把指针赋给指针变量原因如下
函数形参和返回值的需要, 定义函数的时候, 其参数类型如果是指针的话, 只可能是指针变量(也可能是指针常量, 如加上了const修饰), 这是编译器规范的, c语言的规定
举个例子
void foo(int *p);
形参就是指针变量, 不可能是指针值。因为在编译阶段, 程序是无法知道具体的指针值的。
返回值是一个道理, 例如
const char *foo(char *buffer), 在定义函数的时候, 是无法知道具体的指针的

热点排行