c语言指针类型参数的传递方式
2006-12-17 20:04
267 查看
C语言中数组类型和函数类型的参数只能是按地址传递参数;而整数类型、字符类型、浮点类型、枚举类型、指针类型、结构类型和联合类型只能是按值传递参数,这其中指针类型的参数传递方式最容易迷惑。
下面看一个简单的例子:
void set(char *p){
p=NULL;
printf("address of p is %d/n",(signed)p);
}
void main()
{
char *str,a='A';
str=&a;
printf("before call set(),the value of str is %d,value of *str is %c",(unsigned)str,*str);
set(str);
printf("after call set(),the value of str is %d,value of *str is %c",(unsigned)str,*str);
}
输出结果如下:
before call set(),the value of str is 1245048,value of *str is A
address of p is 0
after call set(),the value of str is 1245048,value of *str is A
由此可见,指针变量str的值在调用前后并没改变,所以它所指向的内容也不会变。
在理解了这一点后,再回头看林锐博士的“c/c++高质量编程”中的一道题:
[align=left] void GetMemory(char *p)[/align]
[align=left] {[/align]
[align=left] p = (char *)malloc(100);[/align]
[align=left] }[/align]
[align=left] void Test(void)[/align]
[align=left] {[/align]
[align=left] char *str = NULL;[/align]
[align=left] GetMemory(str);[/align]
[align=left] strcpy(str, "hello world");[/align]
[align=left] printf(str);[/align]
[align=left] }[/align]
[align=left] 问运行Test 函数会有什么样的结果?他给出的参考答案是程序崩溃。因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。[/align]
在理解了指针变量是按值传递后,这道题目就会迎刃而解。
下面看一个简单的例子:
void set(char *p){
p=NULL;
printf("address of p is %d/n",(signed)p);
}
void main()
{
char *str,a='A';
str=&a;
printf("before call set(),the value of str is %d,value of *str is %c",(unsigned)str,*str);
set(str);
printf("after call set(),the value of str is %d,value of *str is %c",(unsigned)str,*str);
}
输出结果如下:
before call set(),the value of str is 1245048,value of *str is A
address of p is 0
after call set(),the value of str is 1245048,value of *str is A
由此可见,指针变量str的值在调用前后并没改变,所以它所指向的内容也不会变。
在理解了这一点后,再回头看林锐博士的“c/c++高质量编程”中的一道题:
[align=left] void GetMemory(char *p)[/align]
[align=left] {[/align]
[align=left] p = (char *)malloc(100);[/align]
[align=left] }[/align]
[align=left] void Test(void)[/align]
[align=left] {[/align]
[align=left] char *str = NULL;[/align]
[align=left] GetMemory(str);[/align]
[align=left] strcpy(str, "hello world");[/align]
[align=left] printf(str);[/align]
[align=left] }[/align]
[align=left] 问运行Test 函数会有什么样的结果?他给出的参考答案是程序崩溃。因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。[/align]
在理解了指针变量是按值传递后,这道题目就会迎刃而解。
相关文章推荐
- 第二周项目1 - C/C++语言中函数参数传递的三种方式】
- 项目1 - C/C++语言中函数参数传递的三种方式
- 指针作为函数参数传递时,编译器处理方式
- 第二周项目 2—C/C++语言中函数参数传递的三种方式
- c语言参数传递方式
- C++ 参数传递方式:值传递,引用传递,指针传递
- C/C++语言参数传递----值传递、引用传递、指针传递、指针引用传递
- 第二周 项目一 C/C++语言中函数参数传递的三种方式(一):传值
- C/C++语言中函数参数传递的三种方式
- 第二周项目1 - C/C++语言中函数参数传递的三种方式
- 第2周项目1-C/C++语言中函数参数传递的三种方式
- 第一周项目 — C/C++语言中函数参数传递的三种方式
- 第二周 项目1-C/C++语言中函数参数传递的三种方式
- 第二周【项目1-C/++语言中函数参数传递的三种方式】
- 第二周项目一-C/C++语言中函数参数传递的三种方式
- 项目1 - C/C++语言中函数参数传递的三种方式
- 第2周项目1 - C/C++语言中函数参数传递的三种方式
- 第二周项目:C/C++语言中函数参数传递的三种方式
- 第1周项目1-C/C++语言中函数参数传递的三种方式
- 第二周项目1-C/C++语言中函数参数传递的三种方式