免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Tanacore
打印 上一主题 下一主题

[C] 问一道关于指针的面试题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-10-16 18:50 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-16 18:54 编辑

回复 19# x5miao
pt[1]访问数据时,不是会调整步长的么?假如是char 类型,步长就是1; 如果是char *,步长就是4吧。
是我理解错了,还是您没有看懂我的意思。
你的代码我知道是对的,你的key point是指的%p吧。

论坛徽章:
0
22 [报告]
发表于 2011-10-16 18:55 |只看该作者
回复 21# wangzhen11aaa


   t的步长是4又不意味着你能直接写t+4来访问数组下一个元素。

论坛徽章:
0
23 [报告]
发表于 2011-10-16 19:01 |只看该作者
本帖最后由 x5miao 于 2011-10-16 19:07 编辑

回复 21# wangzhen11aaa

#include<stdio.h>
char *pt[] = {
  "PT_DATA_COMM",
  "PT_DATA_CONN_CLOSE",
  "PT_DATA_SERV"
};
void fun1(void);
void fun2(void);


int main(void)
{
    printf ("print result1 = %p\n", pt[0]);
    fun1();
    fun2();
    return 0;
}

void fun1(void) {
  char** t = pt;
  printf ("print result2 = %p\n", t[1]);
}

#include <stdio.h>
extern char* pt[];
void fun2(void) {
  printf ("print result3 = %p\n", pt[2]);
}


t[1]=pt[1]=*(pt+1),它怎么可能等于pt+sizeof(char *)?

论坛徽章:
0
24 [报告]
发表于 2011-10-16 19:19 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-16 19:20 编辑

回复 23# x5miao


    c 语言编程中有这么一句话:
编译器自动把下标值的步长调整到数组元素的大小,如果整形的长度是4字节,那么a和a[i+1]在内存中
距离就是4(而不是1)。对起始地址执行加法之前,编译器会负责计算每次增加的步长。
这就是为什么指针的类型总有类型限制,每个指针只能指向一种类型的原因。

如果根据这句话
这里的p[1]和p[0]之间的距离不是1*sizeof(char *)么?那么访问的话错在哪里了?

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
25 [报告]
发表于 2011-10-16 19:24 |只看该作者
回复  x5miao


    c 语言编程中有这么一句话:
编译器自动把下标值的步长调整到数组元素的大小,如果 ...
wangzhen11aaa 发表于 2011-10-16 19:19



    唯一的错误就在于C语言太灵活,灵活性堪比汇编。 搞得一个茴字可能有上百种写法,于是有了这么多水战。

论坛徽章:
0
26 [报告]
发表于 2011-10-16 19:29 |只看该作者
回复 25# 塑料袋

解释的都没有错?
最后结果是啥?考虑半天了,无解。我怎么认为这个题是对的呢

论坛徽章:
0
27 [报告]
发表于 2011-10-16 20:37 |只看该作者
#include <stdio.h>
extern char* pt[];//extern char **pt;并没有什么区别,只在乎你对你片内存怎么解释,实际上都是一个地址,只是这个地址代表的内存中存放的值还是一个地址
void fun2(void) {
  printf ("print result3 = %p\n", pt[2]);
}

你说 pt[1] - pt[0] 应该是 :
1. sizeof(char*) (或者再按你的说法 sizeof(int) )呢
2. 还是 strlen("PT_DATA_COMM")+1 ?
pt[1],pt[0]是存放常量字符串的地址,
OwnWaterloo这个哥们说的是对的,
这3个字符串常量不一定是连续存放的。


勉强总结一下:
char *pt[] = {
  "PT_DATA_COMM",
  "PT_DATA_CONN_CLOSE",
  "PT_DATA_SERV"
};
1:三个字符串常量不一定是连续存放的
2:指针加减与类型相关,单位是元素的大小
  pt+1 实际上就是下一个元素,即存放指向"PT_DATA_CONN_CLOSE"的地址
  (以为该元素是char*,则在32位系统中,地址值增加4)
3实际上最重要的是,你知道这片内存代表什么,你怎么对它进行解释.
pt是指针数组,此时有3个元素,元素的类型是char*,&pt[1]-&pt[0]在32位系统中就是4,
pt[1]-pt[0]结果不确定
4 最终的答案是根据第一个打印出来的值也没有办法确定后面的值,因为字符串不一定是连续存放的
  如果是连续存放的情况下才是+sizeof(char *)

论坛徽章:
0
28 [报告]
发表于 2011-10-16 20:42 |只看该作者
本帖最后由 x5miao 于 2011-10-16 20:55 编辑

回复 27# lwrsmy


    你要别人和你强调多少次?指针和数组是不同的,所以如果在第二个文件把pt声明成char **型的标识符,任何符合标准的编译器都会报错。你写的只能说明你到现在为止还是对指针,指针变量,以及标识符这些概念的含义和差别不理解。

论坛徽章:
0
29 [报告]
发表于 2011-10-16 20:52 |只看该作者
回复 24# wangzhen11aaa


    pt[1]-pt[0]表示的是pt[1]之间的pt[0]距离?你说lz的程序正确,我红色部分标出的那些不是错误?

论坛徽章:
0
30 [报告]
发表于 2011-10-16 20:57 |只看该作者
回复 29# x5miao

谢谢你。不过现在我有点晕了
print result = 134513920
print result = 134513933
print result = 1296912195

lz程序有问题。

出现错误了。我不解了,学习中。怎么和c专家编程上不同呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP