C語言指標最多有多少級?

時間 2021-05-06 22:42:23

1樓:03c84f62d

只要你的記憶體足夠,指標可以無限套娃。

具體操作(省略main函式):

size_t MAX_COUNT = 1024;

int num = 1;

void* point = #

for(size_t i = 0; i < MAX_COUNT ;++i){

point = (void*)(&point);

2樓:

指標級數多到一定地步的時候就已經不再關心級數了,而是你得知道這個變數裡儲存的值經過多少次定址取值之後才能得到變數。

實際上你可以用無符號長整形變數加上乙個計數器去替代多級指標。

3樓:茫然的哈士奇

我只是乙個指標,存放著乙個位址。

至於這個位址所在的東西,它是乙個值也好,是乙個位址也好,關我什麼事?

理論上能在記憶體中開闢多大的空間就能定義多少個指標,至於這些指標之間有什麼關係,關你編譯器什麼事?

我是乙個人,站在1號房間,拿著2號房間的鑰匙。

至於2號房間是個人或是頭大象或是只薛丁格的 。這關我什麼事呢?我只要保管好鑰匙就好,等著別人那我的鑰匙去開2號房的鑰匙。

2號房的人拿著3號房的鑰匙也是一樣。

那麼只要有多少房間不就可以有多少把鑰匙嗎?

所以我就很好奇為什麼會有限制呢?

這裡最多建立了519273級指標,再多乙個就不行了。一共占用記憶體大約10M空間。

這裡是陣列大小限制住了,如果我們使用malloc來建立陣列,那不就可以獲得更大的空間嗎?

這裡便建立了10000000,一千萬級,任然沒有到達極限。後來發現大約在一億級左右就到達極限了。此時占用記憶體大約2G。

4樓:fyw

指標能有多級,算是c語言的乙個毛病,不是說沒用,而是容易被濫用,而且可讀性極差。

我把所有指標都只看做一級,因為乙個指標變數的物理實際意義就只是乙個位址,關於這個位址上的內容是什麼要怎麼用,這不是這個指標變數有義務去記錄的事情,這是程式設計者自己需要考慮的問題。

5樓:fang-cai3

我跑個題.真想要多級指標,是不是可以這樣玩:

struct AA;

struct BB;

struct CC;

struct DD;

...省略一萬行

BB mbb;

mbb.aa->str[0];//這應該算指標的指標吧?

CC mcc;

mcc.bb->aa->str[0]//這應該算指標的指標的指標吧?

DD mdd;

mdd.cc->bb->aa->str[0]//這應該算指標的指標的指標的指標吧?

...ZZ mzz;

mzz.yy->xx->ww->.....aa->str[0];//寫到這裡,估計會被老闆和同事捆起來直接槍斃.

6樓:暮無井見鈴

標準規定限制至少是 12 級,從 C89 到 C17 都沒有變過。

嚴格說來是( C11 的 5.2.4.1 ):

12 pointer, array, and function declarators (in any combinations) modifying an arithmetic, structure, union, or void type in a declaration

12 個在宣告中修改算術、結構、聯合或 void 型別的指標、陣列及函式宣告符(以任何方式組合)

實際上編譯器往往能提供大很多的級數。 C++ 標準推薦(但不要求)為 256 級( [implimits] )。

不過糾結這個可能沒什麼價值,從 3 級有用的情況就比較稀少了。

( 2 級指標可以適用於修改指標物件,或者實現類似 C++ 中 std::deque 的資料結構;更高階的可以用作實現多維鋸齒陣列,但這種結構可能不太好。 C 中可以考慮多維的非常量長度陣列,雖然有些編譯器不支援,參閱 Don』t use fake matrices )

7樓:Aikov

沒有強制要求最多是多少

但是當年一道3重指標考得全班鬼哭狼嚎

實際在用的時候兩重就能把很多人玩死

編譯器不在意,但是不意味著你的大腦不在意

所以這就是為什麼用著用著就換成void*了

8樓:

邏輯上指標的層數沒有限制,但堆砌星號的個數是低效的做法,因為肉眼很難分辨層數(星號的個數),而且很難用迴圈遍歷每一層。

想要實現更好的多層指標,先要回顧一下指標的意義。任何型別的指標都是記憶體中的乙個位址,在現在的64位系統中它就是個64位二進位制整數而已。比如int * *也是個代表位址的整數、這個位址存放的是乙個int *變數。

因此更好的做法是,把這個指標定為通用指標void *型,並且為指標搭配乙個整數來代表當前的層數,然後把指標和層數到乙個結構體中,這樣就能很方便的取到最終層的指標:

struct layered_pointer

;void* get_final_pointer(struct layered_pointer *lp)

9樓:

int *p = &a; 這種語法是C語言裡最精典的指標應用了。

但是這個 *p前面有多少個 * 這個真沒有特殊要求。

實際這個可以分成兩件事來考慮,C語言語法 ISO/IEC 9899:2018 定義。

(6.7.6) pointer

type-qualifier-list(opt)

type-qualifier-list (opt) pointer

(7.7.6) type-qualifier-list

type-qualifer

type-qualifier-list type-qualifier

(6.7.3) type-qualifier:

const restrict volatile _Atomic

從這個詞法定義上看, pointer是乙個遞迴定義,沒有限定 pointer 有多少級的。

如果你去測試,實際上的限制可能會取決於 * ,在當前編譯器裡能處理的棧的大小。因為在編譯階段,要把這個 int ****** p 這一類的東西做詞法處理, ****這個長度就可能會遇到當前處理棧的大小的問題。所以它的處理大小是取決於棧的大小的。

好多年以前我測試過一款編譯器,用到65535個的時候就完蛋了。

你再試下現在的?

或者我建議,學習C++吧, 其實指標的問題不需要這樣想,你需要考慮的是指標指向什麼,基本型別,陣列,字串,物件,函式,檔案指標?

C語言指標與二級指標的問題?

已登出 列印不出來是因為這條語句將嘗試訪問非法 程式不該訪問 的記憶體。printf s pt 嘗試訪問超出劃定範圍的記憶體空間,被作業系統攔下 答主重現了一下,那麼從下圖可以看出,p和pt的位址是0x00affb6c,abc 的首位址是0x00de6b30 那麼解引用pt得到的是0x00de6b3...

C 語言中指標陣列和陣列指標 函式指標 指向函式的指標等等該怎麼理解?

ga6840 direct declarator IDENTIFIER declarator direct declarator direct declarator assignment expr direct declarator declarator direct declarator poin...

(C語言)位址為什麼要變成指標才能賦值給指標變數呢?

szouc C語言中所有資料都具有兩個屬性,乙個是值,另外乙個是型別。即使值相同如果型別不一致也是不同的資料。有一道題 小區內有乙隻狗叫Oscar,有乙隻貓也叫Oscar,大晚上有人喊 Oscar 請問他找誰?Oscar 找我幹嘛?位址是乙個整型資料,而指標具有 指向物件型別的指標 的型別。因此即使...