QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: zy_sunshine

C获取字符数组偏移地址疑问

[复制链接]
发表于 2009-12-24 12:46:04 | 显示全部楼层
我和 jiangtao9999一样,看到指针就晕菜,因为不是学习这行的,所以业余不会强制自己去更解各种指针的应用,现在自己编点小东西倒是慢慢清晰了一些。
C++里的友类、虚函数、接口也是比较头痛的,但C++面向对象和继承的概念还是好理解。前段时间用C混合Qt写了个mxd2现在全改成C++语法了,对象比起具体的指针操作来说要规范多了。
其实并不是所有的东西都会有应用的,比如C++的友类,我都忘掉它的定义了,因为实际应用中一般不会去用什么友类。。。当然或许大的工程要用,一会拿书本看看。
C 的指针操作教程是没啥用的,有些东西是无法很好理解的,多用就懂了。
回复

使用道具 举报

发表于 2009-12-24 12:55:11 | 显示全部楼层
其实理解指针最大的要领就是看有没有分配内存,这是我现在对指针的理解了。
*buf 和buf[]是两个不同的概念
(char*)&buf  (char*)buf 也是不同的概念
编程这东西,你写的东西要学会应对不同的情况,所以说上面两个相同是错误的
分配了内存是一回事,没分配内存是另一回事。
#include <stdio.h>
main()
{
  char buf[] = "This is a test.";
  printf("%s\n", buf);
  printf("%s\n", &buf);
}
这里的&buf指的是引用,而不是取地址,所以引用buf就是buf,据说这样加快编译后的运行速度,C++编程中的函数体经常使用。
对于指针和引用的区别也是很费事的,其实用同一符号表示两个东西(引用和取地址)实在...
回复

使用道具 举报

发表于 2009-12-24 13:12:21 | 显示全部楼层
路过,顺便建议楼主学习一下传说中的 **X 和 &&Y 的这种串联用法……
这才是神奇的指针操作。
回复

使用道具 举报

发表于 2009-12-24 13:30:40 | 显示全部楼层
数组比较特别吧,只好这么理解了。

[ 本帖最后由 haulm 于 2009-12-24 13:36 编辑 ]
回复

使用道具 举报

发表于 2009-12-24 13:34:08 | 显示全部楼层
我补充一下,引用是C++的概念
#include <stdio.h>
main()
{
  int a;
  a=100;
  int *buf ;
  buf=&a;
  int& b=a;
  printf("打印buf所指内容%i\n", *buf);
  printf("打印a=%i\n",a);
  printf("a的地址%i\n",&a);
  printf("buf地址%i\n", &buf);
  printf("b的引用%i\n", b);
  printf("b地址%i\n", &b);
}
这个代码只有g++才能编译,你用gcc编译要出错了。
可以看出引用只是个别名,a和b指向的地址是相同的,楼主可能把C++和C混淆了,其实我也是。。。
回复

使用道具 举报

 楼主| 发表于 2009-12-25 12:51:44 | 显示全部楼层
haulm大哥,,呵呵我可没搞错,,看来你现在也明白了。不过我一直都认为引用是C++的东西,C中&只有取地址的功能。

C中&用在数组上,,如果原来指针是指的数组中的一个元素,用&后指针指的是整个数组(怎样看出来的呢?只要指针加一就知道了,如果指针指的是一个元素,地址就会加sizeof(elem)如果是数组,地址就会加sizeof(array))

不说啦,太麻烦了,越说越说不清,。
回复

使用道具 举报

发表于 2009-12-25 13:21:14 | 显示全部楼层
只有字符数组才这样吧,其它数组也这样么?
回复

使用道具 举报

 楼主| 发表于 2009-12-25 13:25:43 | 显示全部楼层

回复 22# sejishikong 的帖子

见12楼,我测试了int 和char数组都是这样的。
回复

使用道具 举报

发表于 2009-12-25 16:26:34 | 显示全部楼层
引用是 C++ 的东西,C 没有引用一说。
**p 可以,但 &&buf 不可以。
取地址后的值不能用作左值
char buf = 'A';
char** pp_buf = &&buf;   <--- 错误
理由是:
&&buf  =>  &(&buf)
  => 编译器实现为两步:char* &buf = &buf; char** pp_buf = &(&buf);
但是 &buf 这个标识不能被赋值。。
=========================
char* p_buf = &buf;
char** pp_buf = &p_buf;   <--- OK
回复

使用道具 举报

 楼主| 发表于 2009-12-25 18:31:50 | 显示全部楼层

回复 24# nihui 的帖子

这些是?编译器原理的东西?
我一直没有碰计算机原理和编译器原理,感觉很深奥的东西

&buf非指向具体内存块,这个不能赋值可以理解
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-26 04:50 , Processed in 0.078103 second(s), 12 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表