指標陣列 char 和 char 到底有什麼不一樣

時間 2021-05-30 00:44:34

1樓:

char == char const *

應該是這樣的吧,當然,字串是不是常量也是乙個,不過型別是這個應該沒錯來著。

2樓:

我就不寫什麼具體回答了,寫幾個例子,讓以為指標=陣列的同學琢磨一下。

1.int

array

=;int*p=

array

;size_t

size_array

=sizeof

(array

);size_t

size_p

=sizeof(p

);2.

template

size_t

N>size_t

getSizeOf

(constT(

&)[N]

)int

main();

int*p=

array

;size_t

size_array

=getSizeOf

(array

);size_t

size_p

=getSizeOf(p

);return0;

}3.char

*str

="hello world"

;char

str2

="hello world"

;char

*str3

="hello world"

;char

str4

="hello world"

;printf

("%p %p %p %p"

,str

,str2

,str3

,str4);

3樓:扶我起來我還能擼

C++使用指標來處理陣列的,所以就有了陣列名是指向陣列第乙個元素指標的值,凡是陣列的地方換為指標沒問題,利用指標運算,但是,指標的地方,不一定可以換成陣列處理方式,只有指標指向了陣列,才可以換,所以char和char*就好理解了,第乙個做形參的時候,表明這是陣列,當然可以換成後者,但是後者做形參,得看看主調函式傳的實參是不是陣列指標,是的話,也可以等價互換,不然絕對不可以!

4樓:Binarizer

當引數時是一樣的,在傳參時被編譯器隱式轉換為*

sizeof時和取位址&時完全不一樣(好像是廢話...)

直接初始化時,在作用域內分配空間時也不太一樣,char*的會被扔到常量區,只在棧上分個指標;而的是直接棧上分配,出了作用域就自動銷毀

5樓:靈劍

作為引數型別時沒有區別,作為變數型別時有明顯區別,乙個是在分配乙個陣列,乙個是在分配乙個指標,大小就不一樣。使用字串字面量初始化的時候,char會複製字面量到本地陣列中(包括結尾的\0),而char *會指向這個常量字串,這個字串在許多實現中是不可以修改的,使用會修改字串本身的庫函式就會報錯。

6樓:蕭涵

陣列不是指標,指標也不是陣列,這是兩個不同的東西,只是在某些場合下,可以進行相似的操作。

char a[10] = "Hello";

char *p = "World";

a和p在記憶體分別是這樣的(手一抖,多了個w)

可以看出,p是乙個指標,其內容指向乙個陣列;a就是陣列本身;

再看操作上的不同

1、對於sizeof操作符來說,char *p結果是指標大小,我的機器是8,char p[10]結果是陣列大小,是10。

2、對&(取位址)操作符而言,得到的結果不一樣,a = &a = &a[0],這三個數值都一樣,但是型別不一樣,&a是陣列指標char (*)[10],&a[0]是指向第乙個元素的指標,是char *; p != &p,p最為乙個變數,本身需要記憶體存放,這個位址是p本身,&p獲取p本身的位址,型別是char **,p存放的值為指向的陣列首址,所以p != &p

void func(char (*p)[10]);

func(&p); // error

func(&a); // ok

3、編譯器對兩者的處理不同,即訪問a和p(不是內容),產生的彙編不同,具體後補

為什麼會說指標和陣列一樣呢,這是因為在指標代數運算、陣列下標運算和陣列作為引數傳遞給函式的時候,陣列會退化生成指向第乙個元素的指標。p[2] => *(p + 2), a[2] => *(a + 2),在這裡看起來是等價的,而且還有詭異的寫法3[p], 4[a]都是合法表示式,因為都會被轉換成指標運算。

7樓:MaxwellGeng

沒有區別。。

本質都是乙個儲存著某記憶體位址的值型別,先反對一下下面的回答,「陣列型別」和「指標型別」我覺得不應該有這樣的定義,x64平台的每個指標都是乙個無符號的64位的陣列,也就是說我轉換成unsigned long long也完全沒問題,實際上許多時候遇到一些需求也確實可以這麼做。

如果直接char開闢,那就是建立了乙個棧空間的記憶體,比如這裡有個char array[5],它其實也就是棧記憶體版本的malloc(5 * sizeof(char)),沒有區別,而array[3]和*(array + 3)是完全一樣的,不信你輸入乙個3[array]看看行不行,絕對是可以的,因為3[array]會被轉換成*(3 + array),這也是完全合法的。

至於語法,我認為沒必要糾結於語法層面的表象,它們的本質都是對記憶體的管理,比如「用*用來賦值還行,不能用來定義,才可以分配空間出來」這種實際上就是表層語法而已,拋開語法看內涵,實際上就是在棧空間或堆空間劃出一片記憶體而已。。

8樓:ReFantasy

char* 定義了乙個指標。該指標指向的位置有沒有分配記憶體,分配在堆上還是棧上都由程式設計師決定。

char[N]在棧上分配N個char型別空間char*p=new char[10];堆上分配10個charchar array[10]; 棧上分配10個chardelete p; 釋放p所指記憶體

p=array;p指向array的記憶體

9樓:郝峻

Char※ 是乙個指標指向的是乙個字元型別 char「」是乙個字元陣列儲存的是乙個字元型別的陣列 c中字串常量就是乙個指向字元型別的指標而字串變數一般儲存在字元陣列裡

char 指標偏移一次1個位址,int 指標偏移一次4個位址,void 型指標偏移一次是多少個位址呢?

SuperSodaSea 標準 C C 不支援 void 上的加減法,不過 gcc 上有擴充套件 1 Pointer Arith Using the GNU Compiler Collection GCC 6.24 Arithmetic on void and Function Pointers I...

c語言中為什麼不能用char 指向字元陣列?

心不變情依舊 char 是二級指標,表示指標的指標,就是把不連續的空間連線起來,第乙個指標指向char 而char 可以表示一階陣列。 喵NLI 因為char z不是指標,是直接存放於棧中的陣列,這種情況下r z與r z都是獲取到z這個陣列的位址而不是二級指標 charz hello char y ...

鍊錶有三個成員乙個int,和char 陣列,以及指向本結構指標,為什麼注釋掉char陣列就報錯?

在你while迴圈的地方有錯誤,首先先用意義臨時的結構體指標接收要被你free的節點,然後再讓你的context指向next 最後再free 你想要free的那個儲存臨時節點的臨時結構體指標 free完之後要將臨時物件置空,建議而已 樹狀 補充說說為什麼有asdf不會報錯。堆的管理,通常會在一塊空閒...