C語言關於指標,gets()和gets_s()函式的理解

zk_方方發表於2020-12-05

使用const修飾一個指標

int a[5] = {0, 1, 2, 3, 4};
//第一種,指標p1不能修改指向地址上的值。
const int * p1 = a;
//第二種,指標p2不能更改它所指向的地址。
int * const p2 = a;
//第三種,指標p3既不能修改指向地址上的值,也不能更改它所指向的地址。
const int * const p3 =a;

二維指標

  1. 二維指標的兩種宣告。

    int (*p)[4];	//宣告陣列指標,意為指向陣列的指標。加括號是因為[]的優先順序高於*
    int * p[4];	    //宣告指標陣列,意為宣告瞭一個含有4個指標的陣列,陣列中每個元素都是指標
    
  2. 二維地址轉換的一些等價關係,可以方便理解行地址、列地址。

    a[x] == *(a+x)
    a[x][y] == *(*(a+x) + y)

  3. 二維陣列陣列地址、陣列內容和指標之間的關係圖。
    在這裡插入圖片描述

  4. 二維陣列的行地址、列地址關係圖。
    在這裡插入圖片描述

指標函式和函式指標

指標函式就是返回型別是指標的函式。例如:

int * fun(int x,int y);		//宣告瞭一個返回指向int型別的指標的指標函式

函式指標,其本質是一個指標變數,該指標指向一個函式。例如:

int add(int x,int y){
    return x+y;
}
int (*fun)(int x,int y);	//函式指標
int main(){
    fun = add;
    int res = (*fun)(1,2);	//res結果是3
    return 0;
}

gets()函式與gets_s()函式

gets()函式是不幸的,由於gets()唯一的引數words無法檢查陣列是否裝得下記憶體。gets()只知道陣列的開始處,並不知道陣列中有多少個元素。如果輸入的字串過長,會導致緩衝區溢位,即多餘的字元超出了指定的目標空間。如果這些多餘的字元只是佔用了尚未使用的記憶體,就不會立即出現問題;如果它們擦寫掉程式中的其他資料,會導致程式異常。因此,在C11標準中已經廢除了gets()函式,即使它有時候非常好用。在PTA平臺上交C/C++程式碼時,如果使用了gets()函式也會報錯。

gets_s()可作為gets()函式的替代品,它的完整形式是:
gets(words,LEN);
限制了讀書字串的長度。如果讀到換行符,就會捨棄它並且停止。

ets_s()可作為gets()函式的替代品,它的完整形式是:
gets(words,LEN);
限制了讀書字串的長度。如果讀到換行符,就會捨棄它並且停止。

相關文章