C----陣列越界問題、指標入門

西西^^發表於2018-10-18

**

一、陣列的越界問題

**

閱讀下面的程式,你覺得結果會是怎樣的呢???

int main()
{
  int  i;
  int arr[10];
  
for( int i = 0; i<=10; i++)
   { 
       arr[i] = 0;
       printf("%d\n",i);
   }
    
   return 0;
}

執行發現會發生死迴圈,到底是怎麼個情況

首先我們要清楚 ,在定義時 int arr[10];這 裡的10表示的是陣列的長度,而在使用時: arr[i] = 0;這裡的i表示的是陣列的下標。根據習慣,我們從0開始標記,在本題中也就是0~9。
在上面的程式中,當 i = 10; arr[i] = 0; 我們知道10已經超過了這個範圍,那麼,會發生什麼狀況呢?

區域性變數( 定義在函式內部的變數)是儲存在棧空間中的,即先進後出。如下圖所示:
在這裡插入圖片描述

先定義的i, i先進入棧中,在棧底,arr[10]隨後進入棧中,棧底的地址大,棧頂的地址小,要注意的是,雖然arr[0]要比arr[1]早進來,但是arr[1]永遠比arr[0]的地址大
如左圖:
當i 1~9時,arr[i]被賦值為0,當 i=10時,會發生溢位,陣列越界,會牽涉到其鄰近元素,在這個題中,陣列會把i預設成10,執行arr[i] = 0後, i 變為 0,又會重新進入迴圈中去,發生死迴圈。
而事實上,陣列越界的結果是難以想象的,不知道會殃及誰,不知道會發生什麼,因此,在使用陣列時一定要仔細,預防陣列越界問題。

解決的辦法:::
在Visual Studio 2012 編譯器中,系統在給變數分配地址時,不會讓每個變數的地址緊挨著,中間都會被2個“炸彈”隔開,因此在陣列越界時,也就是i=10時,會觸碰到炸彈,導致編譯出錯,因此來提醒我們陣列發生了越界情況。

二、指標初入門

概念:
1、指標==地址

2、* 的三個作用:
(1)3*4 //乘法
(2)int *p //定義一個整型指標變數
(3)*p //解引用

3、 指標大小:與平臺有關
x86或者32位平臺,4位元組
x64或者64位平臺,8位元組

4、指標的存放
通過以前的學習,我們都知道
int a = 10; //整型變數存放整型值
char b = ‘x’; //字元變數存放字元值
double c = 12.3; //浮點型變數存放浮點值

此次類推:
整型指標(地址)變數存放整型指標值
int *p=&a;

閱讀下面的程式碼,理解每條語句的含義

 int main()
    {
     int a = 10;
     int b = 20;
     int *p = &a;
    *p = 100;//a = 100;
     p = &b;
     *p = 200;//b = 200;
      int **pp = &p;
     *pp = &a;//p = &a;
     **pp = 1000;//a = 1000;
     *pp = &b;//p = &b;
    **pp = 2000;//b = 2000;
    
return 0;
    }

在這裡插入圖片描述
如上圖所示,整型指標變數P可以儲存a的地址或b的地址,因此 *p(解引用可以得到a或b的值。

相關文章