1.写出输出结果
#include <iostream>
using namespace std;
void g(int** p);
int main()
{
int line[10], i;
int *p = line; //p 是地址的地址
for (i = 0; i < 10; i++)
{
*p = i;
g(&p);//数组对应的值加1
}
for (i = 0; i < 10; i++)
printf("%d\n", line[i]);
return 0;
}
void g(int** p)
{
(**p)++;
(*p)++;// 无效
}
2.写出程序运行结果
#include <iostream>
using namespace std;
int sum(int a)
{
auto c = 0;
static int b = 3;
c += 1;
b += 2;
return(a + b + c);
}
void main()
{
int I;
int a = 2;
for (I = 0; I < 5; I++)
{
printf("%d,", sum(a));
}
}
3.评价代码
int func(int a)
{
int b;
switch (a)
{
case 1: 30;
case 2: 20;
case 3: 16;
default: 0;
}
return b;
}
则 func(1)=? 答:b没有赋值,所以不知道是什么。
int a[3];
a[0]=0;
a[1]=1;
a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则 a[q-p]=a[2] 解析:指针一次移动一个 int 但计数为1
4.请问一下程序将输出什么结果?
char *RetMenory(void)
{
char p[] = “hellow world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = RetMemory();
printf(str);
}
解析:RetMenory 执行完毕,p 资源被回收,指向未知地址。返回地址,str 的内容应是不可预测的, 打印的应该是 str 的地址。
5.写出输出结果
#include <iostream>
using namespace std;
typedef struct
{
int a : 2;
int b : 2;
int c : 1;
}test;
int main()
{
test t;
t.a = 1;
t.b = 3;
t.c = 1;
printf("%d", t.a);
printf("%d", t.b);
printf("%d", t.c);
return 0;
}
解析:t.a 为01,输出就是 1
t.b 为11,输出就是 -1
t.c 为1,输出也是 -1 。3个都是有符号数 int
6.对下面程序进行分析
void test2()
{
char string[10], str1[10];
int i;
for (i = 0; i < 10; i++)
{
//str1不能在数组内结束:因为 str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符),所以不能结束
str1[i] = 'a';
}
strcpy(string, str1);
//扫描 s2指向的内存,逐个字符付到 s1所指向的内存,直到碰到'\0',因为 str1结尾没有'\0',所以具有不确定性。
}
正确如下:
#pragma warning(disable : 4996)
#include <iostream>
using namespace std;
void test2()
{
}
int main()
{
char string[10], str1[10];
int i;
for (i = 0; i < 9; i++)
{
str1[i] = 'a' + i; //把 abcdefghi 赋值给字符数组
}
str1[i] = '\0';//加上结束符
strcpy(string, str1);
printf("%s\n", str1);
printf("%s\n", string);
return 0;
}
7.分析
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 6,7,8,9,10 };
int *ptr = arr;
*(ptr++) += 123;
printf("%d %d ", *ptr, *(++ptr));
return 0;
}
解析:对于(ptr++) += 123;先做 6 + 123 = 129;然后再做ptr++,指向7;
对于printf(“%d %d “, ptr, *(++ptr));从后往前执行,指针先做++,指向8,然后再输出8,紧接着再输出8;
8.分析下面代码
char *a = "hello";
char *b = "hello";
if(a == b)
printf("YES");
else
printf("NO");
解析:这个简单的面试题目,我选输出 no(对比的应该是指针地址吧),可在 VC 是 YES 在 C 是 NO;lz 的呢,是一个常量字符串。位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,会有可能 a 和 b 同时指向同一个 hello 的。则地址相同。如果编译器没有优化,那么就是两个不同的地址,则不同
9.写出输出结果
#include<iostream>
void foo(int m, int n)
{
printf("m = %d, n = %d\n", m, n);
}
int main()
{
int b = 3;
foo(b += 3, ++b);
printf("b = %d\n", b);
return 0;
}
10.找出错误
#include string.h
main(void)
{
char *src = "hello, world";
char *dest = NULL;
dest = (char *)malloc(strlen(src));
int len = strlen(str);
char *d = dest;
char *s = src[len];
while (len- != 0)
d++ = s- ;
printf("%s", dest);
}
//一共有4个错误;
int main()
{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为分配一个空间
char* d = dest;
char* s = &src[len-1]; //指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = '\0'; //尾部要加’\0’
printf("%sn",dest);
free(dest); // 使用完,应当释放空间,以免造成内存汇泄露
dest = NULL; //防止产生野指针
return 0;
}