求学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越长,用指针的效率就越明显
[解决办法]