1.在C语言中,以下代码执行之后,*p的值为()
void func(int *p)
{
static int num = 4;
p = #
(*p)--;
}
int main()
{
int i = 5;
int *p = &i;
func(p);
printf("%d", *p);
return 0;
}
代码执行后,输出的p的值仍然为5;
因为表面上看函数传参是地址传参,实际上他是值传递他传递的是指针变量p的值,在函数中又定义了一个形参p他与主函数中传递的p的类型相同,值相同,但其实改变的是被调函数中的p,而主调函数中的p并未被改变,所以p还仍然是5.
2.以下程序的打印结果是()
1.#include<iostream>
2.using namespace std;
3.
4.void swap_int(int a , int b)
5.{
6. int temp = a;
7. a = b;
8. b = temp;
9.}
10.
11.void swap_str(char*a , char*b)
12.{
13. char*temp = a;
14. a = b;
15. b = temp;
16.}
17.
18.int main(void)
19.{
20. int a = 10;
21. int b = 5;
22. char*str_a = "hello world";
23. char*str_b = "world hello";
24. swap_int(a , b);.
25. swap_str(str_a , str_b);
26. printf("%d %d %s %s\n",a,b,str_a,str_b);
27.
28. return 0;
29.}
正确答案为hello world world hello
想要交换str_a与str_b两个指针的指向,需要改变两个指针变量的值,而参数传递时传递的是两个指针变量的值,我们知道值传递不会改变原函数中的值,只有地址传递才可以,所以应该传递的是&str_a与&str_b。
3.int a=5,则 ++(a++)的值是?
因为a=5,所以a++也为5,而5是一个常量,是无法作为左值来进行运算的,所以++5是错误的,最终编译出错。
4.下面程序的输出结果是( )
#include <stdio.h>
#include <stdlib.h>
void MallocMem(char* pc)
{
pc = (char*) malloc (100);
return;
}
int main()
{
char *str=NULL;
MallocMem(str);
strcpy(str,"hello ");
strcat(str+2, "world");
printf("%s",str);
return 0;
}
该程序运行时会崩溃。
因为char *str=NULL;是先定义了一个空指针,调用函数MallocMem(str)在传参时传的是str的值,所以这就是一个值传递,我们知道值传递时是不会改变变量原本的值的,所以尽管给pc开了一个100字节大小的空间,但是pc与str实际是两个变量,所以str的值还为NULL,给NULL里面进行拷贝和链接当然是错的。
5.在linux下64位c程序,请计算输出的三个sizeof分别是()
void func(char str_arg[100])
{
cout<<sizeof(str_arg)<<endl;
}
int main(int argc,char* argv[])
{
char str[]="Hello";
char *p=str;
cout<<sizeof(str)<<endl;
cout<<sizeof(p)<<endl;
func("test");
return 0;
}
答案为6 8 8
因为str是一个数组名,sizeof(数组名)得到的是该数组占空间大小,str中Hello占了五个字节空间,\0占了一个字节空间,所以总大小为6个字节;而p是一个指向str数组的指针,64位系统中指针占8个字节;而func函数的形参看起来是一个数组,其实是一个指向数组的指针,所以其大小也为8个字节。