陣列與指標 第一彈

2021-08-19 13:53:21 字數 1662 閱讀 4392

指標和陣列到底是什麼關係呢?這是學習c語言過程中一直困惑著我的問題。通過查詢資料和我的分析總結,有以下分享:

1、陣列是什麼?

依照最常規的概念,陣列就是一組有序資料的集合,其中的每乙個元素都是同乙個型別。現在就以乙個簡單的陣列進行分析:

如上圖所示,我們定義乙個陣列時,編譯器是根據指定元素的個數和元素的型別進行分配記憶體 ,並把這塊記憶體命名為a,a一旦確定就無法改變,a[0],a[1]等為陣列的元素,但它並不是元素的名字,陣列的每乙個元素都是沒有名字的,它只需要根據型別大小來確定記憶體。

要注意:&a[0]與&a的值是一樣的,但是&a[0]表示的是首元素的位址,而&a表示的是整個陣列的位址,當他們進行加1操作時結果是不一樣的並且a是不能作為左值的。簡單來講,我們都知道,左值表示空間,右值表示內容,若將作為左值,那麼編譯器就會以為a是首元素位址,但是以這個位址開始的記憶體是乙個總體,只能訪問陣列的第乙個元素,所以我們只可以以陣列的a[i]為左值,只能通過小塊 ,來訪問到整個陣列的作用

2、指標是什麼?

乙個變數的位址被稱為變數的「指標」,如果有乙個變數專門用來存放另外乙個變數的位址(即指標),則稱它為指標變數,形如 :

int i;

p=&i;

那麼p就是乙個指標變數。指標變數就是位址變數,用來存放位址。

int *p1=&a;

int *p2=&b;

定義指標變數時要注意:

(1) 指標前面的*表示變數的型別為指標型別。變數名是p1,p2.而非*p1,*p2。

(2) 在定義指標變數時必須要指定其基型別。不同型別的資料在記憶體中的存放方式和存放的位元組數都是不同的,不如整型佔四個位元組,字元型佔乙個位元組。

乙個變數的指標含義包含 兩個方面,一是以儲存單元標號表示的位址,二是它指向的儲存單元的資料型別

(3) 如何表示指標型別,指向整型資料的型別表示為「int *」,讀作指向int型的指標。已經知道了乙個int型指標有四個位元組的記憶體,並且限定了這四個位元組只能儲存位址。

區分int *p=null與*p=null:

int *p=null;這段**的意思就是:定義了乙個指標變數p,指向的是乙個int型的變數,在定義它的同時將初值設為0x00000000;

int *p;

*p=null;

這段**的意思是:定義了乙個指標變數p,它指向了乙個int型資料,但是具體是多少並沒有指定,所以有可能是乙個非法位址。給*p賦值為null也就是給p指向的記憶體賦值為null,,由於p指向的記憶體可能是非法的,所以編譯器會跳出乙個記憶體訪問非法的視窗。

int a=8;

int *p=&a;

*p=null;

這段**就成功的把i的值改為0;即將p指向的記憶體的內容從8改為0;而p本身的值,也就是記憶體位址並沒有改變。

那麼陣列和指標到底是什麼關係呢?

陣列就是陣列,其大小與元素的個數有關,定義陣列時必須指定元素個數及型別。陣列中可以存放除函式外任何資料型別。

指標就是指標,指標變數在32位系統下,永遠只佔4個位元組,其值為某乙個記憶體的位址,指標可以指向任何地方,但是不是任何地方你都能通過這個指標變數訪問到。

菜鳥部落格第一彈

隨著乙個多月的大學生活結束,今天終於開始了畢業的第一天工作。請了40多天的假,本來以為工作會悲劇的。但到公司同事和領導的關心使我擔心的小心感到了溫暖。早就想實現這個計畫,想在正式工作的時候寫部落格,也就是想記錄下每天的工作和每天的心情。寫博主要是記下這剛開始艱苦的歲月,不求對別人幫助,本人是菜鳥,歡...

oracle學習第一彈

每當我們建立資料庫例項的時候,就會自動的建立三個使用者 sys使用者 超級管理員,許可權最大 system使用者 系統管理員 scott使用者 普通使用者 有三種方式登入oracle資料庫 1.命令列sqlplus 2.sql developer 3.企業管理器,通過web訪問 sql plus是o...

日常翻譯 第一彈

第一題鏈結 題意 夏洛克和華生正在玩乙個遊戲 nim 這個遊戲有n堆石子被標註成piles1,piles2,pilesn n是石子最大堆數 夏洛克總是第乙個,華生跟他交替進行操作 在每一次操作中都有且只有兩種可能的情況 1.選擇一堆並且從中拿走k個石子,k 0 2.從每一堆石子中都拿走k個石子,k ...