陣列名不等於指標

2021-07-09 22:55:32 字數 2628 閱讀 9307

一直都以為陣列名和指標是相同的含義,直到今天做c軟體工程師筆試題,才恍然大悟,才發現它們之間存在著巨大的差異。題目如下:

void example(char echo)

void main()

的輸出結果是()

a、4b、12

c、13

d、不確定

參***;a

解析;陣列名作為函式引數,退化為指標,指標的大小是4個位元組

問題1;為什麼指標的大小是4個位元組?

首先需要明白位址和偏移位址(實體地址=段位址*16+偏移位址)。段位址和偏移位址都可以由四位十六進製制(用十六進製制只是為了表示方便,用二進位制表示的話太長了)組成如:ffff:0000前面表示段位址後面表示偏移位址,在計算機中每四位二進位制可以表示乙個十六進製制數,那麼八位就表示兩個十六進製制了也就是說兩個十六進製制數表示乙個位元組,那麼段位址佔兩個位元組偏移位址佔兩個位元組加起來就是四個位元組了,而指標變數存放的就是偏移位址和段位址,自然也就是佔四個位元組了。

問題2;陣列如何退化成指標?

首先需要明白為何陣列,陣列不僅包括資料資訊還包括所佔記憶體多少資訊先給三個結論;

(1)陣列名的內涵在於其指代實體是一種資料結構,這種資料結構就是陣列;

(2)陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是乙個指標常            量;

(3)指向陣列的指標則是另外一種變數型別(在win32平台下,長度為4),僅僅意        味著陣列的存放位址!

而指標指標只有資料的頭位址,並不知道資料的長度,因此傳遞陣列的時候,經常伴隨的資料長度。

再其次,陣列名作為函式形參時,在函式體內,它已失去了本身的內涵,僅僅是個指標而已,同時還失去了其常量的特性,可以自增,自減等操作,

比如:int array[10];

array++;

以上就是錯誤的額,只有陣列變成指標後才能以上操作。

問題3 ;sizeof和strlen有什麼區別?

1.sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。 

2.sizeof是算符,strlen是函式。 

3.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。sizeof還可以用函式做引數,比如: 

short f();

printf("%d\n", sizeof(f()));

輸出的結果是sizeof(short),即2。 

4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。 

5.大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度這就是sizeof(x)可以用來定義陣列維數的原因 

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

6.strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。 

7.sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。

8.當適用了於乙個結構型別時或變數, sizeof 返回實際的大小,當適用一靜態地空間陣列, sizeof 歸還全部陣列的尺寸。sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸 

9.陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址,

如: fun(char [8])

fun(char )

都等價於 fun(char *) 

在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小

如果想在函式內知道陣列的大小, 需要這樣做:

進入函式後用memcpy拷貝出來,長度由另乙個形參傳進去 

fun(unsiged char *p1, int len)

我們能常在用到 sizeof 和 strlen 的時候,通常是計算字串陣列的長度,看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:

char str[20]="0123456789";

int a=strlen(str); //a=10; >>>> strlen 計算字串的長度,以結束符 0x00 為字串結束。

int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的陣列 str[20] 所佔的記憶體空間的大小,不受裡面儲存的內容改變。上面是對靜態陣列處理的結果,如果是對指標,結果就不一樣了

char* ss = "0123456789";

sizeof(ss) 結果 4 ===》ss是指向字串常量的字元指標,sizeof 獲得的是乙個指標的之所佔的空間,應該是長整型的,所以是4

sizeof(*ss) 結果 1 ===》*ss是第乙個字元 其實就是獲得了字串的第一位'0' 所佔的記憶體空間,是char型別的,佔了 1 位

strlen(ss)= 10 >>>> 如果要獲得這個字串的長度,則一定要使用 strlen

營銷不等於銷售

營銷 銷售 企業的宗旨就是創造客戶,企業有且只有兩個基本職能,即營銷和創新。營銷和創新創造產出,其它一切環節只能算作投入。營銷與創新是任何乙個組織在設定目標時必須考慮的基本方面,只有這兩個方面才能使企業獲得產出。顧客付款購買的也是企業在這兩個方面的業績與貢獻。我們的使命是什麼?我們的客戶是誰?我們的...

「封口」不等於「風口」!

風口論 已是眼下熱門詞選,只要有一點起勢的行業都會被一些人冠以風口一詞,然後一群人跟著瞎起鬨。他們眼中的的風口就出來了,但是真的能把豬吹起來嘛,那就不見得了。然而一些好的東西,卻在這些假風口的 光芒 下黯然失色。現在我們就來盤點2018年2大風口誤區,和一大過失。投資方等來的不是鉅額的回報,是一張張...

自由不等於免費

課堂回顧 你好,今天我要繼續跟你講 權利 的概念。我要給你澄清兩個連美國的 官都分分鐘弄錯的概念,那就是自由和免費。在英文裡面,自由和免費剛好是同乙個詞,free。我們今天要講的是政治上的自由,政治上的自由權利並不等於經濟上的免費 political freedom is not economica...