选择题
- int a,b;
void swap(&a,&b)交换a,b的值,请选择swap的正确实现()
答案:AA、void swap(int *p1,int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } B、void swap(int *p1,int *p2) { /* 指针p没有初始化,所以直接给*p赋值会导致内存错误 * 在GCC编译器中运行时出现段错误,在VS2015中编译不通过 */ int *p; *p=*p1; *p1=*p2; *p2=*p; } C、void swap(int *p1,int *p2) { /* 只交换了指针变量p1、p2所指向的值,没有实际更改a、b的值 */ int *p; p=p1; p1=p2; p2=p; }
-
int a[][3] = { {20,19,18},{33,34,35},{66,37,38},{1,2,3} }; int *p = a[1] + 5; // *p 的值等于 38 int *y = (int *)(&a[1] + 1); // *y 的值等于 66 ,(&a[1] + 1)的长度是增加了 3*sizeof(int) 个长度 // 此时(&a[1] + 1)的指针类型是 int (*a)[3] ,一个指向长度为3的int型数组的指针
补充:
int b[10] = { 20,19,18,4,5,6,7,8,9,10};
int *p = b + 2; // *p 的值等于 18
int *q = (int *)(&b + 1); // *(q-1) 的值等于 10 ,(&b + 1)的长度增加了 10*sizeof(int) 个长度
struct test{
int a;
int b;
int c;
};
int main()
{
struct test *ss;
ss = (struct test *)malloc(sizeof(struct test));
ss->a = 10;
ss->b = 11;
ss->c = 12;
int *xx = (int *)(ss + 1); //(ss + 1)的长度增加了 sizeof(struct test)个长度
printf("xx = %d\n",*(xx-1)); // xx的值等于 12
}
int main()
{
struct test ss;
ss.a = 10;
ss.b = 11;
ss.c = 12;
int *xx = (int *)(&ss + 1); // (ss + 1)的长度增加了 sizeof(struct test)个长度
printf("xx = %d\n",*(xx - 1)); // xx的值等于 12
}
- 以下程序运行结果是
gae
int main() { char a[] = "Language"; char b[] = "Programe"; char *p1, *p2; int k; p1 = a; p2 = b; /* 判断字符相等则输出 */ for (k = 0; k <= 7; k++) { if (*(p1 + k) == *(p2 + k)) printf("%c", *(p1 + k)); } return 0; }
- 如下函数,输出结果是
4
void example(char acHello[]) { printf("%d\n", sizeof(acHello)); /* 数组在函数参数中传递后退化为指针 */ return; } int main() { char acHello[] = "hello"; example(acHello); return 0; }
-
0x12345678在采用大端模式时内存的排列顺序是
12 34 56 78
在采用小端模式时内存的排列顺序是78 56 34 12
-
定义
int array[10], *m = array, *n = &array[4];
那么n - m
的值是4
解释:两个指针相减,减的是指针之间的间隔多少个单位长度,而不是地址值直接相减。 -
unsigned char aucArray[2][3] = { {1,2},{3,4} };
在内存中的布局是1 2 0 3 4 0
unsigned char aucArray[2][3] = { 1,2,3,4 };
在内存中的布局是1 2 3 4 0 0
- 32位系统,struct BBB的定义如下,则sizeof(struct BBB) =
28
struct AAA { char a[5]; //8 int b; //4 short int c; //4 }; struct BBB { char *d; //4 short int e; //4 struct AAA f; //16 char g; //4 }; /* 当BBB是下面情况时sizeof(struct BBB) = `24` */ struct BBB { char *d; //4 short int e; //2 char g; //2 struct AAA f; //16 };
简答题
- 下面程序的打印结果:
d = 19
,b = -20
解释:C语言的隐式类型转换规则如图:
所以这道题中的a+c
会将a
转化为无符号类型再进行计算,导致结果是一个非常大的值int main() { int a, b; unsigned int c, d; a = -20; c = 19.5; d = (a + c) ? c : a; b = (a + c > 0) ? a : c; printf("d = %d\n", d); printf("b = %d\n", b); return 0; }
- 下列循环将执行多少次?无限次,因为
a
是无符号整型,所以总是大于等于0unsigned short a = 0x100; do{ a--; }while(a >= 0);