C++專項訓練-1

1、Which of the following calling convention(s) support(s) support variable-length parameter(e.g. printf)?(A)

A、cdecl:C語言的缺省調用約定,允許函數的參數的個數是不固定的

B、stdcall:C++的標準調用方式

C、pascal:

D、fastcall

2、求輸出結果

int a[2][2][3]= { {{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};
int *ptr=(int *)(&a+1);
printf(“%d %d”, *(int *)(a+1), *(ptr-1));
  • 答案解析:7 12

    &a是個四級指針,指向的是a這樣的數組,所以它加1,就會跳過整個數組。

    (int )(a+1) 指向數組 a[2] 的第二個元素中的第一個,也就是內部第二層大括號的第一個元素:7

    (ptr-1)整個數組的最後一個元素,因爲 (int )(&a+1) 指向整個數組的下一個位置

  • 相關題:

  int a[5][5];
  int (*p)[4];
  p = a;//當數組名a 作爲右值時,代表的是數組首元素的首地址
  問&p[4][2] - &a[4][2]的值爲多少?(-4)

p是指向一個包含4 個元素的數組的指針。也就是說p+1 表示的是指針p 向後移動了一個“包含4 個int 類型元素的數組”。這裏1 的單位是p 所指向的空間,即4* sizeof(int)

所以,p[4]相對於p[0]來說是向後移動了4 個“包含4 個int 類型元素的數組”,即&p[4]=&p[0]+4*4*sizeof(int)。由於p 被初始化爲&a[0],那麼&p[4][2]=&a[0][0]+ 4 * 4 * sizeof(int)+ 2 * sizeof(int)

&a[4][2]=&a[0][0]+4 * 5 * sizeof(int) + 2 * sizeof(int)

&p[4][2]&a[4][2]的值相差4 個int 類型的元素。

3、下面說法正確的是(B)

​ A、C++已有的任何運算符都可以重載

​ B、const對象只能調用const類型成員函數

​ C、構造函數和析構函數都可以是虛函數

​ D、函數重載返回值類型必須相同

  • 知識點:

    A:

C++中不能被重載的操作符
. (成員訪問或點操作符)
?: (三元操作符或條件操作符)
:: (域操作符)
.* 和 –>* (指向成員的指針操作符)
sizeof (取對象大小操作符)
typeid (對象類型操作符)

B:

  1. const用於修飾函數時,一般是const修飾類的成員函數(函數定義體),表示在函數體中成員變量不能改變;其函數形式爲


    int ff(void)const;const修飾函數的返回值,用於返回常量;

  2. const修飾函數的返回值,用於返回常量.其函數形式爲


    const int ff(); //返回的是常量,所以必須這麼調用const int a=ff();

  3. 關於Const函數的幾點規則:

    • const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數,包括const成員函數.
    • const對象的成員是不可修改的,然而const對象通過指針維護的對象卻是可以修改的.
    • const成員函數不可以修改對象的數據,不管對象是否具有const性質.
    • 加上mutable修飾符的數據成員,對於任何情況下通過任何手段都可修改,自然此時的const成員函數是可以修改它的

C:構造函數不可以

D:重載的概念是:名稱相同,參數個數、次序、類型不同,因此重載對返回值沒有要求,可以相同,也可以不同,但是如果參數的個數、類型、次序都相同,名稱也相同,僅返回值不同,則無法構成重載

如:

  public int A(int i);
  public double A(int i);//wrong

而:

  public int A(int i):
  public double A(double i);//right

4、下面的函數哪個是系統調用而不是庫函數 ( read ) ?

printf、scanf、fgetc、read、print_s、scan_s

  • 知識點:
系統調用 系統調用(system call)運行在用戶空間的應用程序向操作系統內核請求某些服務的調用過程。是操作系統內核提供的函數,在內核態運行(kernel mode)。由於系統調用不考慮平臺差異性,由內核直接提供,因而移植性較差
庫函數 庫函數(library function)是由用戶或組織自己開發的,具有一定功能的函數集合,一般具有較好的移植性,通過庫文件(靜態庫或動態庫)向程序員提供功能性調用。是在系統調用上的一層包裝,運行在用戶態(user mode),庫函數不光可以在系統調用的基礎上包裝,也可以在其他庫函數的基礎上包裝,提供更高級的抽象,更強大的功能。比如OGRE對OpenGL的包裝,Qt對Xlib的包裝。

5、malloc函數進行內存分配是在什麼階段?(執行階段,也就是運行階段)

6、char * const p, char const * p, const char *p 上述三個的區別,說法錯誤的是?(AC)

​ A、char * const p; 常量指針,p的值不可以修改

​ B、char const * p;指向常量的指針,指向的常量值不可以改

​ C、const char *p;常量指針,p的值不可以改變

  • 知識點:常量指針,可以改變它指向的地址,但不能改變指向的內容,形式:char const * pconst char *p;指針常量,我們可以改變他指向的內容,卻不能改變它指向的地址,形式:char * const p

7、分析代碼

#include <stdio.h>
#define P_char char*         //語句1//預處理階段執行的
#typedef char* char_P        //語句2//編譯階段
char arr[10]="movie";
int main() {
    P_char p1, p2;//相當於char* p1; char p2;
    char_P p3, p4;//相當於char* p3; char* p4;
    const P_char pa;//常量指針,指針可變,指向的值不變
    const char_P pb;//指針常量,指針地址不變,指向的值可變
    p1=arr;
    p2=*(arr + 3);
    p3=&(arr[2]);
    p4=arr + 4;
    printf("%s,%s,%s,%s\n", p1, p2, p3, p4);   //語句3:movie,i,vie,e
    return 0;
}

知識點:#define和#typedef

define typedef
編譯之前的預處理過程 編譯過程
進行簡單的字符串代換(原地擴展),不作正確性檢查,只有在編譯已被展開的源程序時纔會發現可能的錯誤並報錯。例如:#define PI 3.1415g26在預處理不出錯,程序中的:area=PI*r*r會替換爲`3.1415g26*r*r出錯 不是簡單替換 ,而是採用如同定義變量的方法那樣來聲明一種類型。
# define int_ptr int *
int_ptr a, b; 
//相當於int *a, b; 只是簡單的宏替換

typedef int* int_ptr; 
int_ptr a, b; //a, b 都爲指向int的指針,typedef爲int* 引入了一個新的助記符 
typedef int * pint ; 
#define PINT int *

const pint p ;//指針常量,p不可更改,但p指向的內容可更改 
const PINT p ;//常量指針,p可更改,但是p指向的內容不可更改。

pint是一種指針類型 const pint p 就是把指針給鎖住了 p不可更改 
而const PINT p 是const int *p 鎖的是指針p所指的對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章