指標,陣列,變數引數傳遞的一點總結

2021-06-08 02:01:20 字數 2882 閱讀 3081

測試**:

#include

int add(int sum, unsigned char *p, unsigned char u8len)

return sum;

}int main(int arg, char **argv)

;unsigned char u8sum = 0;

unsigned char u8len   = 6;

unsigned char *ptemp = au8temp;

u8sum = add(0, au8temp, u8len);

printf("u8sum: %d\n", u8sum);

u8sum = add(0, ptemp, u8len);

printf("u8sum: %d\n", u8sum);

return 0;

}  

關於函式傳遞的值傳遞與指標傳遞。

這裡對於傳遞的引數而言都是值傳遞,

因為在呼叫被調函式時,被調函式的入參已經分配了棧空間,這個時候傳過來的引數就是將值寫進這個這個被調函式的棧記憶體單元中(紅色部分有錯誤,修正見注釋3)。

這個時候可以這樣理解,對於傳遞的引數是變數(對於變數的解釋見註1)的,取其內容傳遞給被調函式的入參,即寫入入參的棧位址空間;對於傳遞的引數是常量(對於常量的解釋見註2)的,直接將此常量寫入入參的棧位址空間。

所以這裡的指標傳遞,實質仍是值傳遞。

傳遞陣列名,常量,變數,指標變數的情況如下:

u8sum = add(0, ptemp, u8len);

(gdb) p au8temp                              --陣列中的內容,陣列名是陣列的首位址。

$1 = "\002\003\004\005\006\a"

(gdb) p &au8temp                            --對陣列名取位址,等於陣列所在的首位址。

$2 = (unsigned char (*)[6]) 0xbffff458

(gdb) p u8len                                    --變數u8len的內容 

$3 = 6 '\006'

(gdb) p &u8len                                  --變數u8len的位址

$4 = (unsigned char *) 0xbffff45f "\006x���\200��������\226\237"

(gdb) p ptemp                                  --指標變數ptemp的內容

$5 = (

unsigned char *) 0xbffff458 "\002\003\004\005\006\a\033\006x���\200��������\226\237"

(gdb) p  &ptemp                              --指標變數ptemp的位址

$6 = (unsigned char **) 0xbffff460

(gdb) s                                             --進入被調函式

add (sum=0, 

p=0xbffff458 "\002\003\004\005\006\a\033\006x���\200��������\226\237", 

u8len=6 '\006') at test_parameter.c:7

7          while(u8len > 0)

(gdb) p sum                                      --入參sum的內容

$7 = 0

(gdb) p &sum                                    --入參sum的位址(add函式的棧空間)

$8 = (int *) 0xbffff440

(gdb) p p                                           --入參p的內容

$9 = (

unsigned char *) 0xbffff458 "\002\003\004\005\006\a\033\006x���\200��������\226\237"

(gdb) p &p                                         --入參p的位址    (add函式的棧空間)

$10 = (unsigned char **) 0xbffff444 

(gdb) p u8len                                     --入參u8len的內容

$11 = 6 '\006'

(gdb) p &u8len                                   --入參u8len的位址(add函式的棧空間)

$12 = (unsigned char *) 0xbffff434 "\006/�"

注:1.指標也是變數,即指標變數,陣列名是位址常量。陣列和指標不一樣。一般變數預設表示是在變數位址上加上*號,取其內容。而取其位址時,反而要加&取位址符了。指標變數比一般變數麻煩就在於它的內容還是乙個位址,需要我們自己再加乙個*號,才能取到真正的內容。

2.有const關鍵字的還認為是變數,唯讀變數。陣列名屬於常量。陣列名對其取位址,還是其本身。

3.關於傳入引數,是在主調函式的棧記憶體中,而不是在被調函式的棧記憶體中。

記憶體分布如下:

傳入引數                               (有可能被優化到暫存器中)

frame pointer

------------------------------------   主調函式和被調函式的棧記憶體分界

區域性變數

指標陣列,陣列指標,簡短一點

這兒討論三種定義 int array 3 int array 3 int arrary 3 int array 3 這個其實是指向乙個陣列的指標,該陣列的大小為3 include using namespace std int64 t hoge 3 intmain int array 3 array...

陣列指標 指標陣列的一點心得

int main 顯然,這是位址連續的情況下可以這樣使用。而動態記憶體分配建立的二維陣列是不能這樣用的,因為各個一維陣列之間是不連續的。int main 使用一重指標訪問二維陣列元素 double p double a cout p 1 3 2 endl 6 自己算偏移量就行了 system pau...

陣列指標和指標陣列的一點小小理解

最近要找工作了,做了一些面試題目,發現變成基礎這塊的知識是一點也不存在了,而面試題目總是挑我們不清楚的東西來回折騰,這不在陣列指標和指標陣列這塊又出現問題了,筆者又好好的回憶了下,然後做個小小筆記,防止再忘。int p n 指標陣列 指標的陣列 理解方法 首先的優先順序高,所以 int p n 其中...