1樓:百度文庫精選
內容來自使用者:zzbo2022
讓你不再害怕指標
前言:複雜型別說明
要了解指標,多多少少會出現一些比較複雜的型別,所以我先介紹一下如何完全理解一個複雜型別,要理解複雜型別其實很簡單,一個型別裡會出現很多運算子,他們也像普通的表示式一樣,有優先順序,其優先順序和運算優先順序一樣,所以我總結了一下其原則:從變數名處起,根據運算子優先順序結合,一步一步分析.下面讓我們先從簡單的型別開始慢慢分析吧:
intp;
//這是一個普通的整型變數
int*p;//首先從p處開始,先與*結合,所以說明p是一個指標,然後再與int結合,
//說明指標所指向的內容的型別為int型.所以p是一個返回整型資料的指標
intp[3];//首先從p處開始,先與結合,說明p是一個陣列,然後與int結合,
//說明陣列裡的元素是整型的,所以p是一個由整型資料組成的陣列
int*p[3];//首先從p處開始,先與結合,因為其優先順序比*高,所以p是一個陣列,
//然後再與*結合,說明陣列裡的元素是指標型別,然後再與int結合,
//說明指標所指向的內容的型別是整型的,所以p是一個由返回整型資料
//的指標所組成的陣列
int(*p)[3];//首先從p處開始,先與*結合,說明p是一個指標,然後再與結合
//(與"()"這步可以忽略,只是為了改變優先順序),說明指標所指向的
//內容是一個陣列,然後再與int結合,說明陣列裡的元素是整型的.
//所以p是一個指向由整型資料組成的陣列的指標
int**p;//首先從p開始,先與*結合,說是p是一個指標,然
2樓:騰訊電腦管家
c語言中的陣列是指 一類 型別,陣列具體區分為 int 型別陣列,double型別陣列,char陣列 等等。同樣指標 這個概念也泛指 一類 資料型別,int指標型別,double指標型別,char指標型別等等。
通常,我們用int型別儲存一些整型的資料,如 int num = 97 , 我們也會用char來儲存字元: char ch = 'a'。
我們也必須知道:任何程式資料載入記憶體後,在記憶體都有他們的地址,這就是指標。而為了儲存一個資料在記憶體中的地址,我們就需要指標變數。
因此:指標是程式資料在記憶體中的地址,而指標變數是用來儲存這些地址的變數。
c語言中,指標的運算是怎麼算的,如pa++
3樓:匿名使用者
指標自加一位
就是指向該型別的下一個單元
也就是實際增加的地址值
為sizeof(*pa)
4樓:雲淡風輕in蘇州
pa++就是pa = pa+1
但是這個1的位元組數是根據pa指標的型別來取值的比如int* pa;那這個1就是sizeof(int)double*pa;那這個1就是sizeof(double)陣列的話,很簡單,就是指向下一個元素的地址!
5樓:我是你爺
要看什麼型別,它會指向下一個變數的首地址,比如p指標是long int型的,p++就會跳過四個位元組指向下一個。一般指標自加運用於陣列中,因為這樣可以方便指標一個個指向陣列中的成員。
6樓:罪_飄落無殤
如果是陣列就指向下一個元素地址
7樓:維真
指向pa後面一個地址
c語言指標運算
8樓:匿名使用者
是5沒錯,,,這個指標是 *的優先順序高於後++ 所以y 等於5
9樓:匿名使用者
y=(*--p)++;
可以分解成:--p; y=(*p); (*p)++;
c語言指標詳解
10樓:徜逸
指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。資料在記憶體中的地址也稱為指標,如果一個變數儲存了一份資料的指標,我們就稱它為指標變數。
計算機中所有的資料都必須放在記憶體中,不同型別的資料佔用的位元組數不一樣,例如 int 佔用 4 個位元組,char 佔用 1 個位元組。
為了正確地訪問這些資料,必須為每個位元組都編上號碼,就像門牌號、身份證號一樣,每個位元組的編號是唯一的,根據編號可以準確地找到某個位元組。
c語言用變數來儲存資料,用函式來定義一段可以重複使用的**,它們最終都要放到記憶體中才能供 cpu 使用。資料和**都以二進位制的形式儲存在記憶體中,計算機無法從格式上區分某塊記憶體到底儲存的是資料還是**。
當程式被載入到記憶體後,作業系統會給不同的記憶體塊指定不同的許可權,擁有讀取和執行許可權的記憶體塊就是**,而擁有讀取和寫入許可權(也可能只有讀取許可權)的記憶體塊就是資料。
cpu 只能通過地址來取得記憶體中的**和資料,程式在執行過程中會告知 cpu 要執行的**以及要讀寫的資料的地址。
如果程式不小心出錯,或者開發者有意為之,在 cpu 要寫入資料時給它一個**區域的地址,就會發生記憶體訪問錯誤。這種記憶體訪問錯誤會被硬體和作業系統攔截,強制程式崩潰,程式設計師沒有挽救的機會。
變數名和函式名為我們提供了方便,讓我們在編寫**的過程中可以使用易於閱讀和理解的英文字串,不用直接面對二進位制地址,那場景簡直讓人崩潰。
需要注意的是,雖然變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是地址的助記符,但在編寫**的過程中,我們認為變數名錶示的是資料本身,而函式名、字串名和陣列名錶示的是**塊或資料塊的首地址。
擴充套件資料
指標使用(
* 和 &
)
*&a可以理解為*(&a),&a表示取變數 a 的地址(等價於 pa),*(&a)表示取這個地址上的資料(等價於 *pa),繞來繞去,又回到了原點,*&a仍然等價於 a。
&*pa可以理解為&(*pa),*pa表示取得 pa 指向的資料(等價於 a),&(*pa)表示資料的地址(等價於 &a),所以&*pa等價於 pa。
對星號*的總結
在我們目前所學到的語法中,星號*主要有三種用途:
1、表示乘法,例如int a = 3, b = 5, c; c = a * b;,這是最容易理解的。
2、表示定義一個指標變數,以和普通變數區分開,例如int a = 100; int *p = &a;。
3、表示獲取指標指向的資料,是一種間接操作,例如
11樓:興夏真堵薄
*t=*a
令指標t指向的地址的內容等於指標a指向的地址的內容。
如int
i=1,
j=2,
*t=&i,
*a=&j;,執行*t=*a後,i變為j的值2。
t=a令指標t指向指標a指向的地址。t和a現在指向同一地址。
如int
i=1,
j=2,
*t=&i,
*a=&j;,執行t=a後,t指向j。再執行*t=1則j的值變為1。
關於C語言指標自增運算的問題,c語言中指標可不可以用在自增自減運算子中
搗蒜大師 這寫操作等價 p p 都是p加,然後 這些操作等價 p p p 相當於先 了,然後p再 include main p 指向2 printf d n p 2 p p 1 p指向3 printf d n p p指向4,再 4 p p 1 p指向5 printf d n p 5,p指向6 p p...
關於c語言中指標賦值的問題,關於C語言中指標賦值的問題
計算天下 你這樣想說明你還沒有真正理解記憶體和指標。int a 表示編譯器隨機取出一個空閒的地址分配給a,不妨設為00000000,長度為sizeof int 不同編譯器可能不同。int p 也表示隨機取出一個空閒的地址分配給p,不妨設為000000f0,長度一般為4個位元組,則這四個位元組現在儲存...
c語言指標的概念,論述C語言中指標的概念和作用,並舉例說明
指標是c語言中廣泛使用的一種資料型別。運用指標程式設計是c語言最主要的風格之一。利用指標變數可以表示各種資料結構 能很方便地使用陣列和字串 並能象組合語言一樣處理記憶體地址,從而編出精練而高效的程式。指標極大地豐富了c語言的功能。學習指標是學習c語言中最重要的一環,能否正確理解和使用指標是我們是否掌...