關於c語言中對陣列取址的問題詳見補充

時間 2021-09-07 13:29:16

1樓:匿名使用者

不好意思,剛才回答太輕率了。

請看如下程式:

#include "stdio.h"

void main()

這個程式可以說明,a是int *型別,而&a是指向int [4]陣列的指標。所以a和&a是型別不一樣,但值是一樣的。

所以,你的問題中,a,&a[0]和&a,雖然型別不完全一樣,但就數值來說是一樣的,在統一強制型別轉換為(int32u *)後,當然就成一樣的了。

2樓:

(a) 是一維陣列首位址,

(&a[0]) 還是一唯陣列首位址 與(a)等價(&a) 二唯陣列首位址,其一唯的寬度就是陣列a的元素個數首位址值是相同的,而你都做了強制轉換,所以看不出差別如果用以下方法,就可以看出差別了

3樓:靈七

對於乙個陣列來說,陣列名是乙個位址常量

並不是說是乙個位址常量就沒有位址(也就是儲存常量的儲存單元)

當程式沒有被調入記憶體時候,是由三部分**組成的,依次是二進位制**區(text segment),已經被初始化的靜態或者全域性變數區(data segment),沒有被初始化的靜態或者全域性變數區(bss segment),常量都是存放在data segment區

當程式被調入記憶體之後,就在三部分的基礎上又被分配了堆區和棧區,棧區用來存放臨時變數,引數和返回值等臨時的變數

就相當於我們定義char *a="12345",我們都知道這裡的「a」是main()中定義的乙個指向字串「12345」的指標,那麼「12345」是存放在**的呢,就是存放在data segment區的,而「a」變數本身確實存放在程式調入記憶體後被自動分配的棧區

強制轉換的本質上是不改變儲存單元中的01**組合的,只是告訴編譯器這個單元的資料將要被作為什麼資料處理,例如乙個指標變數佔據4位元組,乙個int變數也是四個位元組,我們就可以把int強制轉換成指標的,需要的時候再把指標轉換成int,輸出int型結果時是不發生變化的

在這個題目中,「a」是乙個陣列名,也就是乙個位址常量,這個常量存放在data segment區,「&a」取了「a」的位址,也就是乙個指向「a」的指標,所以第三個語句是把指向「a」的指標進行了強制轉換,第乙個語句直接轉換的「a」,第二個語句強制轉換指向「a[0]」的指標

4樓:黃邦勇帥哥哥

陣列與指標的問題,必須弄清楚指標的型別這一概念,一維陣列int a[5]; 陣列名a相當於乙個指標,他的型別是「指向int的指標「 ,a與&a[0]是等價的, 而&a; 的型別則是「指向一維陣列的指標「,這個一維陣列有5個元素,a與&a的位址值是相同的,但他們的型別完全不同,型別決定了再進行計算時進行怎樣的操作,比如a+1,指標只偏移1個int大小的單位,但&a+1就會偏移乙個含有5個元素的一維陣列的單位,也就是偏移5個int這麼遠。二維陣列也是同樣的道理,比如int a[3][4]; 其中a與&a[0]相同表示的是乙個指標,他的型別是「指向一維陣列的指標」這個一維陣列有4個元素,同理&a表示的是「指向二維陣列的指標」,這個二維陣列的形式是[3][4],而a[0]與&a[0][0]相同,表示的是「指向int的指標「,但是,a, &a, a[0]他們的位址是相同的,唯 一區別在於型別不同,型別不對就決定對其指標進行運算時,其計算的方式就會有很大不同。對於陣列與指標,指標的型別就顯得相當重要,這是一般的教材裡面從未提到的。

具體更詳細的內容請參閱本人所作《c++指標與陣列專題》有詳細介紹,怎樣理解二維及多維陣列與指標的關係。

5樓:匿名使用者

//3種寫法都是正確的。下面是測試程式及執行結果。

#include

int main()

;printf("%d\n",*(int *)a);

printf("%d\n",*(int *)(&a));

return 0;

}//執行結果:111

6樓:

&a代表的不是取a這個變數的位址,而是取陣列元素的位址,這樣就不難理解了

7樓:匿名使用者

贊成queenbelle_的回答,簡潔明瞭。

c語言關於字串陣列取位址的問題。到底要不要&呢?

8樓:匿名使用者

格式"%s"輸入字串到字元陣列不需要加取址符&

9樓:

你說對了啊。對乙個字串指標來說,在scanf函式中「要」與「不要」都能得到正確結果,你可以放心使用。如果你用了&發現有問題,那就趕快告訴我,讓我也長進一下。

原因是這樣的:scanf把變數列表中的&解釋為單純的取位址,都轉化成了指向字串首字元的指標。如果有char a[10];,則a是這10個字元的第乙個字元的位址,&a是這10個字元組成的字串的首位址,但二者的「值」一樣的,因為10個人站在那裡,第乙個人的地方也是這一排人排頭的地方。

區別在於:a+1是第二個元素的位址,而&a+1是第二排的首位址,跑到a[9]後面的那個元素的位址上了。而scanf在接收字串時對後者的意義是不理會的,還按乙個字元乙個字元地向後安排讀取,所以用了&仍然是正確的。

不過為便於閱讀和規範,在下覺得不用為好。

10樓:匿名使用者

對於格式"%s",對應的引數應該是位址。作為字元陣列的product1.cname、product1.

cshape等,用作函式實參時,會被自動轉化為指標,指標指向的就是位址,所以不需要加取址符&,所以

scanf("%s",product1.cname);是對的,而scanf("%s",&product1.cname);是錯的。

11樓:倒霉熊

不需要啊 陣列名就代表陣列的首位址啊。

關於c語言中陣列作為函式引數的函式之間呼叫問題

12樓:肥仙女

1、新建乙個陣列作為引數專案,如圖所示:

2、新增乙個array.c檔案,如圖所示:

3、包含stdio.h和stdlib.h標頭檔案,如圖所示:

4、輸入main函式主體及返回值,如圖所示:

5、定義乙個陣列arr,如圖所示:

6、定義乙個function函式,如圖所示:

7、將陣列作為引數傳遞給function函式,如圖所示:

8、執行程式,輸出結果,如圖所示:

13樓:董音廣子珍

這問題說明你對指標的運用還是不熟練的,既然是陣列,作為函式引數傳遞的是陣列首位址.

#include

#include

void

func1(int

*array,

intsize)

}//陣列array_b根據陣列array_a的元素乘以項數獲得元素值

void

func2(int

*array_a,int

*array_b,

intsize)

//輸出陣列元素

void

print(int

*array,

intsize)

intmain(void)

14樓:匿名使用者

函式在陣列中的呼叫是以陣列名為實參呼叫的,因為陣列名就是陣列的首位址,所以說對陣列的呼叫是不需要返回值的,主調函式裡面的陣列值會隨被調函式的形引數組改變而改變,當然這些都是在你以陣列名作為實參的前提下

15樓:駭客之劍

如果傳遞值是指標(位址),也就是陣列名,雖然在子函式裡面,但複製過去的是位址,所以可以對位址裡面指向的內容進行操作,也就是乙個子函式中可以實現對多個值的操作,如果傳遞的是內容,則至多通過return 進行乙個返回值操作,總之,要看你傳什麼

16樓:匿名使用者

nt *&pvec是c++中的指向int型別指標的引用,就是pvec本身是對函式呼叫時實參的乙個引用,而這個實參的型別是乙個指向整形的指標型別,之所以使用引用,是因為要在函式中修改這個指標的內容。(如果只需要修改指標指向的記憶體單元的內容,只需要用指標型別作為形參就可以)

int &size 中size同樣是乙個引用,是指向int型別的乙個引用,目的同樣是修改引用的實參的值。

fstream在c++中是乙個檔案流型別,可以讀取也可以寫入,fstream&可以傳入乙個fstream型別的物件,在函式中的目的同樣是修改原有實參的內容,引用不會對實參進行拷貝。

關於c語言中「陣列」的問題。

17樓:匿名使用者

一 ,s為陣列s的陣列名,他指向s[0],k = arrin(s) 是指 函式arrin的返回值賦給k;int *a是指 定義了乙個指向 整型變數 的指標a,他向函式內部傳遞s所帶的資訊

二,那是巨集定義,讓m的值為100

三,m能變,他影響陣列s的長度

我說的不一定標準,這是我的理解……

完事兒請採納,有事請追問

18樓:浪花滌英

一,k=arrin(s);中的s 是函式arrin的被呼叫時傳遞的實際引數,簡稱實參,*a是函式的形式引數,簡稱形參。

1. 形參未被呼叫時,不佔儲存單元。形參只在呼叫過程中占用儲存單元。形參定義時必須指定型別!

2. 實參是常量、變數或表示式!要與形參型別一致!而且實參要有確定的值,在呼叫過程中實參將值賦給形參!

3. c++中實參對形引數據傳遞時是單向傳遞的,在儲存單元中是不同的單元!

二,為什麼要用#define m 100 ?這裡的100起著什麼作用?

這裡的100是乙個常數,這個預處理語句的作用是定義m來表示100。這有幾個好處:一是可以採用乙個便於識記且有意義的名字,二是將來若修改時,只需要改動這一處。

詳細的解釋說明請參閱相關的教程.

19樓:echoの忽忽

#include

#define m 100

void arrout(int *,int);//型別為空的輸出陣列函式

int arrin(int *);//型別為整型的輸入陣列函式main()

int arrin(int *a) //*a也是引數,這裡是形式引數,簡稱形參,它是乙個指向整型變數的指標,它的值是由上面的s傳遞過來的

return i;

}void arrout(int *a,int n)//最後 m的值就是覺得s[m]這個陣列大小的,它的值可以改變.對程式的影響就是,系統分配的記憶體空間大小的改變。

希望我的回答可以幫到你。o(∩_∩)o~

C語言中怎樣實現對陣列資料的刪除 修改

include typedef struct nodenode node c 100 int n void print printf n n 輸出 void setnum 設定資料 void remove 迴圈覆蓋,讓後一個覆蓋前一個,所以j最大值取n 1 n 結構體中的元素減少1個 刪除資料 vo...

關於易語言中陣列的理解,易語言中陣列的問題

顧名思義,陣列 就是一組資料 陣列可以看成一個集合,集合就是 一堆東西 集合裡的每一個 東西 叫作元素。這是數學裡這樣定義的 也可以看成阿伏伽德羅常數 6.02 10 23 個微觀粒子 每6.02 10 23個微觀粒子叫做1mol這個微觀粒子 這是化學裡這樣定義的 而在易語言中,這個 集合 也就是陣...

C語言中關於指標和陣列命名處的問題

空雪夢見 前者出錯的原因就和 int a 10 a 1 是一個道理。一個是可以往裡面存指標的陣列,一個是指向陣列的一個指標。後者,char month 是宣告 指向陣列的一個指標 的語法這種語法必須指定陣列的大小才能宣告。char month 是宣告 一個可以存指標的陣列 的語法,後面就適用 初始化...