几道C语言题目
第一題
下面代碼的輸出結果是?
int main(){
int a[][3] = {1, 2, 3, 4, 5, 6};
int (*ptr)[3] = a;
printf("%d, %d\n", (*ptr)[1], (*ptr)[2]);
++ptr;
printf("%d, %d\n", (*ptr)[1], (*ptr)[2]);
system("pause") ;
return 0 ;
}
結果
2, 3
5, 6
分析
ptr的類型是int(*)[3],那么*ptr的類型便是int[3],也就是int*(編譯器會將數組名轉換成指針),所以*ptr相當于指向第一個元素1的指針,所以ptr[1] = 2, ptr[2] = 3
++ptr相當于將ptr向后移動三個int,也就是12個字節,所以此時ptr指向元素4,那么ptr[1] = 5, ptr[2] = 6
第二題
下面代碼輸出什么?
int i = 3;int j = sizeof(++i + ++i);
cout << i << endl ;
cout << j << endl ;
1. 首先j的值肯定是4,因為無論括弧內部的值是多少,它始終是int類型。
2. i的值不是5,因為sizeof雖然是一個編譯時運算符,但是卻有函數的性質,就是說,它有參數。這里括弧里面相當于sizeof的參數。而且i是值傳遞的。所以不會影響到原來的值,i = 3
如果是下面這樣呢?
int i = 3;int j = (++i+ ++i);
cout << i << endl ;
cout << j << endl ;
很顯然,i = 5, j = 10.
第三題
下面代碼輸出什么?
void f1(int *, int);void f2(int *, int);
void(*p[2]) ( int *, int);
int main()
{
int a = 3;
int b = 5;
p[0] = f1;
p[1] = f2;
p[0](&a , b);
printf("%d\t %d\t" , a ,b);
p[1](&a , b);
printf("%d\t %d\t" , a ,b);
getchar() ;
}
void f1( int* p , int q)
{
int tmp;
tmp =*p;
*p = q;
q= tmp;
}
void f2( int* p , int q)
{
int tmp;
tmp =*p;
*p = q;
q= tmp;
}
輸出 5 5 5 5
注意,函數f1()和f2()確實能交換p和q,但是要注意,這里的q是指傳遞,所以不會影響原來的值。
總結
- 上一篇: PowerPoint2010 中停止使用
- 下一篇: 桂林理工大学2023年博士招生什么时候开