2级还在担心吗?进来就给你吃定心丸!<1>--指针问题
4 posters
2级还在担心吗?进来就给你吃定心丸!<1>--指针问题
[center]关于指针!!
1 我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么
问题?char *p; *p = malloc(10);
答:你所声明的指针是p, 而不是*p, 当你操作指针本身时(例如当你对其赋值, 使
之指向别处时), 你只需要使用指针的名字即可:
p = malloc(10);
当你操作指针指向的内存时, 你才需要使用* 作为间接操作符:
*p = ’H’;
2 *p++ 自增p 还是p 所指向的变量?
后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和
*(p++) 等价, 它自增p 并返回p 自增之前所指向的值。要自增p 指向的值, 使用
(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。
3 我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。
为什么如下的代码((int *)p)++; 不行?
在C 语言中, 类型转换意味着“把这些二进制位看作另一种类型, 并作相应的
对待”; 这是一个转换操作符, 根据定义它只能生成一个右值(rvalue)。而右值既不
能赋值, 也不能用++ 自增。(如果编译器支持这样的扩展, 那要么是一个错误, 要
么是有意作出的非标准扩展。) 要达到你的目的可以用:
p = (char *)((int *)p + 1);
或者,因为p 是char * 型, 直接用
p += sizeof(int);
但是, 在可能的情况下, 你还是应该首先选择适当的指针类型, 而不是一味地
试图李代桃僵。
4 我有个函数,它应该接受并初始化一个指针void f(int *ip) { static
int dummy = 5; ip = &dummy;} 但是当我如下调用时: int *ip;
f(ip); 调用者的指针却没有任何变化。
你确定函数初始化的是你希望它初始化的东西吗?请记住在C 中, 参数是通
过值传递的。被调函数仅仅修改了传入的指针副本。你需要传入指针的地址(函
数变成接受指针的指针), 或者让函数返回指针。
5 我能否用void** 指针作为参数, 使函数按引用接受一般指针?
不可移植。C 中没有一般的指针的指针类型。void* 可以用作一般指针只是
因为当它和其它类型相互赋值的时候, 如果需要, 它可以自动转换成其它类型; 但
是, 如果试图这样转换所指类型为void* 之外的类型的void** 指针时, 这个转换不
能完成。
6 我有一个函数extern int f(int *); 它接受指向int 型的指针。我怎
样用引用方式传入一个常数?下面这样的调用f(&5); 似乎不行。
在C99 中, 你可以使用“复合常量”:
f((int[]){5});
在C99 之前, 你不能直接这样做; 你必须先定义一个临时变量, 然后把它的地
址传给函数:
int five = 5;
f(&five);
7 C 有“按引用传递” 吗?
真的没有。
严格地讲, C 总是按值传递。你可以自己模拟按引用传递, 定义接受指针的函
数, 然后在调用时使用& 操作符。事实上, 当你向函数传入数组 时, 编译器本质上就是在模拟按引用传递。但是C 没有任何
真正等同于正式的按引用传递或C++ 的引用参数的东西。另一方面, 类似函数的
预处理宏可以提供一种“按名称传递”的形式。
8 我看到了用指针调用函数的不同语法形式。到底怎么回事?
最初, 一个函数指针必须用* 操作符(和一对额外的括弧) “转换为” 一个“真
正的” 函数才能调用:
int r, func(), (*fp)() = func;
r = (*fp)();
而函数总是通过指针进行调用的, 所有“真正的” 函数名总是隐式的退化为指
针(在表达式中, 正如在初始化时一样。参见问题1.14)。这个推论表明无论fp 是
函数名和函数的指针
r = fp();
ANSI C 标准实际上接受后边的解释, 这意味着* 操作符不再需要, 尽管依然
允许。
1 我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么
问题?char *p; *p = malloc(10);
答:你所声明的指针是p, 而不是*p, 当你操作指针本身时(例如当你对其赋值, 使
之指向别处时), 你只需要使用指针的名字即可:
p = malloc(10);
当你操作指针指向的内存时, 你才需要使用* 作为间接操作符:
*p = ’H’;
2 *p++ 自增p 还是p 所指向的变量?
后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和
*(p++) 等价, 它自增p 并返回p 自增之前所指向的值。要自增p 指向的值, 使用
(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。
3 我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。
为什么如下的代码((int *)p)++; 不行?
在C 语言中, 类型转换意味着“把这些二进制位看作另一种类型, 并作相应的
对待”; 这是一个转换操作符, 根据定义它只能生成一个右值(rvalue)。而右值既不
能赋值, 也不能用++ 自增。(如果编译器支持这样的扩展, 那要么是一个错误, 要
么是有意作出的非标准扩展。) 要达到你的目的可以用:
p = (char *)((int *)p + 1);
或者,因为p 是char * 型, 直接用
p += sizeof(int);
但是, 在可能的情况下, 你还是应该首先选择适当的指针类型, 而不是一味地
试图李代桃僵。
4 我有个函数,它应该接受并初始化一个指针void f(int *ip) { static
int dummy = 5; ip = &dummy;} 但是当我如下调用时: int *ip;
f(ip); 调用者的指针却没有任何变化。
你确定函数初始化的是你希望它初始化的东西吗?请记住在C 中, 参数是通
过值传递的。被调函数仅仅修改了传入的指针副本。你需要传入指针的地址(函
数变成接受指针的指针), 或者让函数返回指针。
5 我能否用void** 指针作为参数, 使函数按引用接受一般指针?
不可移植。C 中没有一般的指针的指针类型。void* 可以用作一般指针只是
因为当它和其它类型相互赋值的时候, 如果需要, 它可以自动转换成其它类型; 但
是, 如果试图这样转换所指类型为void* 之外的类型的void** 指针时, 这个转换不
能完成。
6 我有一个函数extern int f(int *); 它接受指向int 型的指针。我怎
样用引用方式传入一个常数?下面这样的调用f(&5); 似乎不行。
在C99 中, 你可以使用“复合常量”:
f((int[]){5});
在C99 之前, 你不能直接这样做; 你必须先定义一个临时变量, 然后把它的地
址传给函数:
int five = 5;
f(&five);
7 C 有“按引用传递” 吗?
真的没有。
严格地讲, C 总是按值传递。你可以自己模拟按引用传递, 定义接受指针的函
数, 然后在调用时使用& 操作符。事实上, 当你向函数传入数组 时, 编译器本质上就是在模拟按引用传递。但是C 没有任何
真正等同于正式的按引用传递或C++ 的引用参数的东西。另一方面, 类似函数的
预处理宏可以提供一种“按名称传递”的形式。
8 我看到了用指针调用函数的不同语法形式。到底怎么回事?
最初, 一个函数指针必须用* 操作符(和一对额外的括弧) “转换为” 一个“真
正的” 函数才能调用:
int r, func(), (*fp)() = func;
r = (*fp)();
而函数总是通过指针进行调用的, 所有“真正的” 函数名总是隐式的退化为指
针(在表达式中, 正如在初始化时一样。参见问题1.14)。这个推论表明无论fp 是
函数名和函数的指针
r = fp();
ANSI C 标准实际上接受后边的解释, 这意味着* 操作符不再需要, 尽管依然
允许。
齿轮Gear- 帖子数 : 6
注册日期 : 12-03-17
地点 : 湖北武汉
您在这个论坛的权限:
您不能在这个论坛回复主题
周日 十月 14, 2012 3:37 pm 由 15178959183
» 新人报道~我不是吐槽贴。。。
周三 五月 16, 2012 5:38 pm 由 萝卜爱喝水
» 课后作业1:编一个程序
周三 五月 09, 2012 11:24 pm 由 廖承启
» C语言初级课堂2--"Hello world"
周六 五月 05, 2012 12:52 am 由 醉之殇
» 新人来报道了。。。。。。
周四 五月 03, 2012 8:50 pm 由 sunquanwen
» 新人报到,字怎样就大了
周三 四月 25, 2012 7:50 am 由 wanghong
» 果断的。来报道啦。。。嘿嘿,我是新手哦
周六 四月 21, 2012 2:41 pm 由 ゛﹏小冲哥ゞ ✿『人事精英』✿李帅
» 指针数组与行指针的异同
周一 四月 09, 2012 3:59 pm 由 *小耳朵*
» 行指针q引用数组元素的方法
周一 四月 09, 2012 3:46 pm 由 *小耳朵*