C語言部分題目解析
1、有以下程序
#include <stdio.h>
int main ()
{
int i = 1, j = 2, k = 3;
if (i++ ==1 || (++j == 3 || k++ == 3))
printf(“%d%d%d\n”, i, j, k);
return 0;
}
答案:223
解析:|| 全假爲假,有真即真 ,i++ == 1, 先取i與1比較,再自增,成立且+1爲2,||後面不再計算
2、char a[7] = “a0\0a0\0”;則
sizeof (a) = 7; 數組字節數1 * 7 = 7
strlen (a) = 2; 計算有效長度,即第一個\0爲止,且不計算\0
3、
#include<stdio.h>
void f(int *x, int *y)
{
int *t;
t= x;
x= y;
y= t;
}
int main ()
{
int a[8] = {1, 2, 3, 4, 5, 6, 7, 8},i, *p, *q;
p= a;
q= &a[7];
while(p < q)
{
f(p, q);
p++;
q--;
}
for(i = 0; i < 8; i++)
printf("%d",a[i]);
return 0;
}
答案:12345678
解析:調用函數f,只能改變形參地址,沒有通過地址的解引用改變數組的值(可以通過畫內存圖分析)
4、
#include<stdio.h>
int fun(int a)
{
int b = 0;
staticint c = 2;
b++;
c++;
return (a + b + c);
}
int main()
{
int i,a = 5;
for (i = 0; i < 3; i++)
printf("%d%d",i,fun(a));
return 0;
}
答案:09110211
解析:static int c = 2,靜態變量,在內存的靜態存儲區,只初始化一次以後再次使用將使用上一次的值。i = 0, a = 5, b = 1, c = 3; i= 1,a = 5, b = 1, c = 4; i = 2, a = 5,b= 1, c = 5
5、
#include<stdio.h>
#include <stdlib.h> //free()
#include <string.h> //strlen()
int main()
{
char *src = "hello,world";
char *dest = NULL;
long len = strlen(src);
dest = (char *)malloc(len + 1); //strlen不計算'\0',malloc要加1
char *d = dest;
char *s = &src[len - 1]; //取最後一個元素地址
while (len-- != 0)
{
*d++ = *s--; //解引用賦值
}
*(d + len + 1) = '\0'; //倒序賦值結束之後,*d後面加'\0',*d ='\0';
printf("%s,%ld\n",dest,sizeof(strlen(src)));
free(dest); //釋放開闢的堆空間
return 0;
}
6、
#include<stdio.h>
void main()
{
int a = 1, b;
for(b = 1;b <= 10; b++)
{
if(a >= 8)
break;
if(a % 2 == 1)
{
a += 5;
continue;
}
a = 3;
}
printf("%d\n",b);
}
答案:4
解析:b = 1, a = 1,進入循環,a += 5, a變成6,continue 結束本次循環進行下一次循環; b = 2, a = 6, 第二次循環,a = 3,a變成3; b = 3, a = 3, 第三次循環,a +=5 , a變成 8; b = 4, a = 8 , 第四次循環,break,跳出循環
7、編程實現,刪除字符串s中值爲c的字符串
void Delchar(char s[] , char c)
{
int i, x, len;
len = strlen(s);
for (i = 0; i < len; i++)
{
if (s[i] == c)
{
for (x = i; s[x] != '\0'; x ++)
s[x] = s[x + 1];
len--;
}
}
}
8、該程序有什麼問題?
#include <stdio.h>
#include <stdlib.h>
void GetMemory(char **p, int num)
{
*p = (char *)malloc (num);
}
int main()
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf("str1 is %s \n",str);
free(str); //已經釋放堆空間,雖然得到地址並可以進行修改,但是該塊內存空間已經自由,不被原變量控制
if(str != NULL)
{
strcpy(str, "hello,Baby!");
}
printf("str3 is %s \n",str);
}
9、該程序有什麼問題?
#include <stdio.h>
int main()
{
char a;
char *s = &a;
strcpy(s,"hello"); //a是char類型,內存中佔1個字節,s是char類型指針,它的值是a的地址,不能通過strcpy來對s賦值
printf("%s\n",s);
s= "hello2"; //可以通過這條語句,讓s指向另外的“hello”
//*s = "hello3";
printf("%s\n",s);
}
10、
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *p = (int *)(&a + 1);
printf ("%p\n",a);
printf ("%p\n",&a);
printf ("%p\n",&a[0]);
printf ("%p\n",a+1);
printf ("%p\n",&a[1]);
printf ("%p\n",&a+1);
printf ("%p\n",p);
printf ("%p\n",&a[5]);
printf ("%p\n",&a[4]);
printf ("%p\n",p-1);
printf("%d, %d\n",*(a + 1),*(p - 1));
}
答案:2, 5
解析:
0x7fff5fbff8c0 a的地址,即a[0]的地址
0x7fff5fbff8c0 &a
0x7fff5fbff8c0 a[0]的地址
0x7fff5fbff8c4 a的地址的下一個元素的地址
0x7fff5fbff8c4 a[1]的地址
0x7fff5fbff8d4 取整個數組a的地址再加1,p指向下一個a[5]的第一個元素
0x7fff5fbff8d4 p的地址
0x7fff5fbff8d4 a[5]的地址
0x7fff5fbff8d0 a[4]的地址
0x7fff5fbff8d0 p-1的地址
2, 5
11、
#include <stdio.h>
intmain()
{
int a = 2, b = 4;
int const c = 3;
const int *d = &a;
int *const e = &d;
int const * const f = &a;
*c = 32; //c是一個整型常量,不是指針,不能解引用
d = &b;
*d = 43; //d指向常量的指針,不能通過解引用改變值
e = 34; //e是整形指針常量,一經初始化不能更改其值
e = &a; //e是整形指針常量,一經初始化不能更改其值
f = &b; //f和*f都不能更改
}