一道C 陣列問題,請高手指教

2025-01-19 05:40:28 字數 4360 閱讀 9866

1樓:聲琨

樓上的很詳細,精神可嘉,但你說的很多都錯了,你不要誤導人家了。

int (*ip)[4]:其實這是定義了乙個變數ip,它是指向int[4]型別的指標。

int *ip[4] 才是定義了乙個指標陣列,共有4個元素。就像整形陣列一樣,只不過每個元素對應的資料都是乙個整型指標值而已。

int ia[3][4]; 這個其實可以看成ia是包含3個int[4],即為3個單元的長度為4的一維整型陣列。

int (*ip)[4]=ia; /將第乙個一維陣列int[4]的首位址賦給變數ip

typedef int int_array[4]; 這個的意思不是說用int代替int_array[4],而是用int_array 代替 int [4]型別;

int_array *ip=ia; /這樣的話int_array *ip就相當於int (*ip)[4]了。

樓主你好好看看書,多看點例子慢慢就明白了。

2樓:網友

int (*ip)[4]:定義乙個指標陣列,共有4個元素。就像整形陣列一樣,只不過每個元素對應的資料都是乙個指標值而已。

int *ip[4] :定義4個指向整形資料的指標,如。

int *ip[4];

ip[0]=&ia[0][0];

這樣是把ia陣列的第乙個元素的位址給了ip[0],也就是說ip[0]中存的實際是ia數字的第乙個元素的位址,而*ip[0]才是ia第乙個元素的具體數值。

例:1) int ia[3][4] =

int (*ip)[4] =ia;

執行結果:*ip)[0] =49(ia陣列中第乙個元素「1」對應的ascii碼)

ia = 0x0012ff50

ip[0] =0x0012ff50(ia第乙個元素的位址)ip[1] =0x0012ff60(ia第二個元素的位址)2)int ia[3][4] =

int* ip[4];

ip[0] =ia[0][0];

執行結果:ip[0] =49

ip[0] =0x0012ff50(ia[0][0]的位址)ia[0][0] =0x0012ff50

c/c++問題,陣列問題,菜鳥求教,望高手指教:

3樓:網友

你這個問題基本上屬於編譯問題,應當是編譯原理的課程裡面的內容。

c/c++是乙個龐大語言家族,但實際上c和c++是有很大差別的語言,這些僅在十分深入後才能明白。

1、在c語言中,函式中變數的定義是統一考慮的:

例如:int x;

char charater[30];

那麼當進入函式時(前半個大括號,會將所需要的堆疊空間在記憶體中一次性分配),本例中為34

2、棧空間的管理是編譯器的重要功能。每乙個堆疊空間屬於誰是編譯器的問題,但是它將結果放到了你的最終程式中。所以這段空間的實際分配就是你的程式本身,或者說就是你自己要求分配的。

附加一句,棧空間相對較大,尤其在linux等c語言原生系統中,棧空間幾乎可以和整個記憶體空間相比擬)

3、在c語言中是固定分配的。編譯器看到char s[30]; 就會知道,s是乙個符號(參見編譯原理符號表),它佔用30位元組的空間。考慮上面的例子,s的位置就是 棧頂+4,類似可推理,s+1就是棧頂+5,s+100就是棧頂+104(越界了)。

c語言編譯器實際上並不清楚s+100不屬於s(30個位元組的空間內),s對於編譯器只是乙個符號。代表了30個char,起始位址是棧頂+4。特別注意的是當使用遞迴方法時,char s[30]實際上對應了n*30的棧空間。

4、前面多次提到了符號表,編譯器看到定義就將符號送入了符號表。sizeof就是讓編譯器輸出符號表的一部分內容。注意sizeof不是函式,他直接被編譯器識別,你可以寫 sizeof s。

但不能寫strlen s。

5、從語言的定義上來說是不確定的。但是在特定的系統中可能是固定的。

棧空間是反覆利用,也就是說,你這個棧空間的值取決於上乙個函式的執行過程。上乙個函式就是main呼叫前的乙個函式。這些函式一般位於c0中。

一般的c0是為c語言程式,分配棧空間,處理命令列引數等的程式,是c語言庫函式的一部分。

比如,全域性變數的生命週期就比main生命週期長,c0就會給全域性變數分配空間。

4樓:滄海雄風

1、棧 非記憶體 動態申請的才在記憶體。

2、為其分配空間的是計算機。

3、編譯器告訴系統的。

這裡的35是因為你的字串沒有初始化 因此 裡面是隨機字元 因此 有可能有\0

開始是根據這個\0得出的長度。

而這裡的30 是sizeof 獲得的。

c語言中判斷資料型別長度符的關鍵字。

用法 sizeof(型別說明符,陣列名或表示式);

或 sizeof 變數名。

1. 定義:

sizeof是c/c++中的乙個操作符(operator),簡單的說其作用就是返回乙個物件或者型別所佔的記憶體位元組數。

msdn上的解釋為:

the sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). this keyword returns a value of type size_t.

其返回值型別為size_t,在標頭檔案中定義。這是乙個依賴於編譯系統的值,一般定義為。

typedef unsigned int size_t;

世上編譯器林林總總,但作為乙個規範,它們都會保證char、signed char和unsigned

char的sizeof值為1,畢竟char是我們程式設計能用的最小資料型別。

5樓:網友

1、在記憶體。

2、計算機所有的硬體資源都是由作業系統管理,當然包括記憶體。但內是像char charater[30];這樣定義得到。

容的記憶體是在棧裡,棧是程式一開始執行由作業系統分配(一般大小為2mb),而30這個大小是由編譯器來決定。總言之,char charater[30];是這樣的,作業系統給你程式分配棧記憶體(程式一開始執行就給),你的編譯器決定如何使用(編譯出exe之後就決定了,並不執行後才)

3、因為記憶體位址連續,通俗來說是連在一起的。

4、sizeof是乙個編譯時的運算子,不是乙個函式!!!編譯時意思是說c++編譯器在編譯cpp檔案時必須得出結果,否則會出錯。如果你要問c++編譯器怎麼知道sizeof(s)會是30,那我問你它怎麼會知道s是char型別的呢?

5、應該是系統有某種機制,並不會完全從內容裡清除已經退出的程式,而是保留一段時間來加速第二次啟動。這也說明我們的系統很久時間不關機可用記憶體會越來越少,再算退出所有程式之後,可用記憶體也不會有剛開機那時那麼多。

有點囉嗦了,再說一句,這些,你的課程裡可能有講到,就是 作業系統原理 計算機原理。

6樓:記住一座城

問題bai1,在記憶體中,準確的說在棧中。du問題2.操作。

zhi系統分配。

問題3.同上。dao

問題4.編譯器版通過你給出的30判斷,比如權我打算給你一筆錢,但是我沒告訴你是多少,你知道是多少嗎?

問題儲存在棧中,由低位址到高位址儲存,可能是恰好有乙個'\0'所以結束。

7樓:網友

第乙個問題:當然是記憶體中。cpu中能夠儲存資訊的只有相應的暫存器,其儲存位數有限,但是存取速度極快(對cpu來說就是自己家的東西,可以信手拈來)。

所以一般的分配沒有特殊說明都是在記憶體中(仔細追究起來實在記憶體空間中的棧空間中。當然利用new,malloc,alloc等申請的就在堆中——其實也是記憶體中的一部分,可參考有關作業系統的書籍)。

第二個問題:記憶體的分配最後都是有作業系統來完成的。當然也需要用到mmu的配合。

第。三、四問題:c++中規定定義陣列時,陣列的大小必須是乙個常數,或者乙個常量表示式(如3+4)等,常量表示式在編譯階段,編譯器就能夠計算出其結果,從而在編譯過程中就能夠將大小,如本題中的30,告知作業系統,來申請合適的記憶體大小。如果你非要細究系統是怎樣識別的,這個問題可就有的**了。

每一種編譯器的識別方式不太一樣,有的是在陣列前開闢乙個空間,(如32位機子,開闢4位元組空間)來記錄陣列的大小,從而告知編譯器;有的則是在陣列連續空間結尾處設定分割位元組(如在vc除錯狀態下的:0xcd、0xcc等位元組)。總之肯定需要一定的方式告知計算機陣列的大小。

第五題:這個要糾結到strlen函式的設定問題上了,strlen預設的終止符號式『\0』,所以由於你的陣列沒有初始化,你每次編譯的時候出現的結果很可能不同,(如果程式沒有大的修改,每次編譯結果很可能相同,你可以通過修改release和debug模式,;來迫使系統重新分配一下空間,來看一下,結果肯定是不一樣的)。

希望對你有一些提示。

可以參考相關的書籍《作業系統》《c++反彙編與逆向技術分析》等。

求高手指教一道有機題,高中一道有機題,求指教,謝謝

題有問題,nmr給出的h數是12,而分子式給的10.如果nmr是對的,結構可能是 ch3ch2ooc c6h4 ch ch cho或者是 ch3ch2ooc c6h4 c ch2 cho 1 不飽合度5 有苯環 2 ir中可看出有苯環 酯 醚 3 五種氫 推測結構 高中一道有機題,求指教,謝謝 c中...

C語言解決排列組合問題請高手指教

include 陣列a 10 為固定值,一共10個數字,每個元素的值分別為1,1,1,2,2,4,5,3,4,2,另有三個不相關的變數值2,3,4 這三個數字以任意的排列組合加到陣列a的某一個 或幾個元素中 可以全部加到a 1 上,也可以加到a 2 a 3 a 8 上 隨意加的 這三個變數只能加一次...

請告高手指教劍三電腦配置的問題,請高手指教關於顯示卡問題

你這個顯示卡還想玩劍3,首先把顯示卡換一下吧,不懂繼續追問吧,碼字不易望採納 你好 首先這個配置也就是中等配置,不是很高。在沒有人的地方,資料處理量回小,自然不卡答。當你資料量大了,反應不過來,自然就卡。還有就是看看你的遊戲設定成64位沒有。想換成高階配置的硬體,個人建議是i7 處理器,8g以上記憶...