指標問題char pbuf pbufnew char

2022-10-03 13:35:23 字數 4726 閱讀 7741

1樓:空雪夢見

第二句給這個指標分配了100個位元組的空間,不是800。

指標確實是指向記憶體塊的地址,指標型別不是確定地址範圍,而是確定單個元素的長度

要不然pbuf+5到底是加幾個位元組?char*就是加 5 * 1位元組,如果是int*那麼就加5 * 4位元組

2樓:佈雷德伊蘭

當然要型別啊,沒有型別指標怎麼定址啊。

char型別是一個位元組。那麼指標在定址的時候就是一個位元組的定址;

如果是int型別的指標,那麼就是4個位元組的定址;

char *str = new char[100];sizeof(str)

3樓:她是我的小太陽

在c/c++裡陣列作為引數時傳遞的實際上是指向陣列第一個元素的指標,因此sizeof(str)返回的是指標的大小,即4。

注意以下三種形式的引數是完全等價的:

void func(char str[100]);

void func(char str);

void func(char *str);

因為傳遞的本質上是指標,所以維數也是不必要的。以下呼叫是完全合法的:

void func(char str[100]);

char ch[10];

func(ch);

4樓:

sizeof(str)= 4; //指標佔用4個位元組記憶體

5樓:匿名使用者

char[100]是動態分配的,所以sizeof(str)只是指標的大小

6樓:匿名使用者

sizeof(str) = 4

因為str是指標,不管是什麼型別的指標,int或者double,也不管指向什麼,都是4。

因為指標,即地址,所以一個指標在記憶體中就佔4個位元組的位置。

這有些基本資料型別的位元組數的習題,你可以看的全面一些http://blog.163.

7樓:顏愈少

你的程式目標是什麼?

char* p = new char[0]//這有什麼實際用處嗎?

8樓:

p=new char[0];是在程式堆中分配了0個char大小的空間,同時指標p指向這塊記憶體的首地址 ,也就是char[0]這個資料項的地址。因為p是一個指標變數,可以進行變數的相應的操作(比如自加之類的),當前p指向char[0],*p ,就是char[0]對應的值。p++就指向了char[1]依次類推...

在沒有給p賦初值的時候p也是可以進行p++操作的,可是沒有意義。因為p本身的初值是沒有意義,它表示了一塊沒有意義的地址。你讓他加加也就說不通了,沒初值是可以編譯過去的。

9樓:海獅

很多怪異的用法,和實際情況有關,沒有上下文不好判斷。

比如,下面的**:

int foo()

10樓:匿名使用者

new 動態記憶體分配的宣告標誌。 char* p = new char[0] 意思是 為char指標 動態分配了具有0個char元素的陣列

11樓:匿名使用者

貌似沒什麼實際的用途,分配0個元素

char *p=new char[10]的意思

12樓:

p=new char[10];是在程式堆中分配了10個char大小的空間,同時指標p指向這塊記憶體的首地址 ,也就是char[0]這個資料項的地址。因為p是一個指標變數,可以進行變數的相應的操作(比如自加之類的),當前p指向char[0],*p ,就是char[0]對應的值。p++就指向了char[1]依次類推...

在沒有給p賦初值的時候p也是可以進行p++操作的,可是沒有意義。因為p本身的初值是沒有意義,它表示了一塊沒有意義的地址。你讓他加加也就說不通了,沒初值是可以編譯過去的

指標操作必須賦初值的

char a=9;

那如果char *p=&a;

這樣p++有意義嗎,他本身初值對啊

你覺得有意義麼?你想到一個什麼結果?比如a的地址為0x00000008,你加上一個一之後指標的值是0x00000009,這個裡面放的什麼你是不知道的,作業系統也不會讓你讀取裡面的資料,這樣的話就可以崩潰

13樓:匿名使用者

new char[10]的意思是動態定義一個長度為10的字元陣列,

然而p=new char[10]就是把動態定義好的那個陣列的首地址給p這個指標變數。就可以p++啦

14樓:匿名使用者

new 的話,相當於是10個地址的了啊,p++就是指向後一個元素

c++中,可以用delete釋放一個陣列的空間嗎?

15樓:匿名使用者

這樣定義陣列的話是在棧上分配記憶體,超過作用域範圍的時候會自動釋放掉,使用new操作符分配的記憶體,是在堆上,需要使用delete釋放,因此如果像你那樣定義陣列的話,不必釋放記憶體

16樓:

用delete釋放的只能是用new動態分配的陣列空間,若陣列不是動態分配的則不能用delete釋放。

舉兩個例子詳細說明一下:

int a[100];

這個陣列a是不能用delete釋放空間的,因為這個陣列a在宣告時就已經說明了空間的大小,在最後程式會自動釋放這個空間。

int *b;

b=new int[100];

這個要在最後用delete b; 語句來動態釋放,因為陣列b是一個動態陣列,陣列空間是動態分配的,程式是不能自動釋放的,所以要自己用delete來釋放。

17樓:

不行運算子delete必須用於先前new分配的有效指標,如果用delete釋放的記憶體空間不是用new申請的,可能會引起程式執行錯誤。

char aa[100];

這樣定義的,不用手動釋放記憶體空間 。

如果是char *aa;

aa=new char[100];..

..delete aa;

18樓:皇家救星

只有通過new申請的記憶體塊才需要用delete釋放如char *p = new char[10];

要用delete p;釋放

而其它的不用(如lz舉的例子 char aa[100])

19樓:匿名使用者

可以的。

如果這個資料是在堆上分配的記憶體可以用 delete來釋放delete aa;

這樣就可以了。

20樓:

這樣定義的,不需要手動釋放,也不可以手動釋放,會出錯如果是這樣的才可以

char *aa;

aa=new char[100];

//...

delete aa;

c++ 錯誤的指標 char *

21樓:匿名使用者

charbuffer只是個指標,並沒有為存放字串申請空間,應該改為

char charbuffer[100]; // 假定填入字元不超過200 - 1個。

格式串中的格式應與被格式化的資料型別對應起來,int 用 "%d",char * 用 "%s",等等,被格式化的字串資料存入charbuffer,系統還會在串末尾新增結束符'\0',此後這個串可以被複制,輸出等操作。比如printf("%s\n",charbuffer);。

22樓:

指標和陣列的區別

用運算子sizeof可以計算出陣列的容量(位元組數)。示例中,sizeof(a)的值是12(注意別忘了』\0』)。指標p指向a,但是sizeof(p)的值卻是4。

這是因為sizeof(p)得到的是一個指標變數的位元組數,相當於sizeof(char*),而不是p所指的記憶體容量。c++/c語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。

注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。不論陣列a的容量是多少,sizeof(a)始終等於sizeof(char *)。

char a = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12位元組

cout<< sizeof(p) << endl; // 4位元組

指標只是儲存了一個地址,該地址可以指向一個記憶體(new出來的,臨時陣列都可),陣列本身具有空間,大小在定義時就是固定的。

陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其地址與容量在生命期內保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。

本例中,應當使用陣列而不是指標。

char charbuffer[128];

memset(charbuffer,0,128);

可以直接使用charbuffer做char*使用在需要的地方

23樓:

char * charbuffer;改成char charbuffer[500];

求教 指向指標的指標的問題,求教 指向指標的指標的一個問題。

指標在計算機中是一個32位 即四位元組 的一個值,這32位資料代表一個地址,當你宣告瞭一個 char p的指標的時候,自動分配了32位大小的空間儲存指標p,但是,注意,p沒有指向任何空間,所以 p操作是錯誤的,你必須先為 p分配一塊空間才行,具體做法如下 p char malloc sizeof c...

c語言指標問題

因為我的數字很大,用指標的話效率高。這句話不對啊,數字大小和運算時間沒有必然聯絡,比如100乘以101和1000乘以1001的運算時間是一樣的。另外,現代的編譯器優化能力非常強,不必什麼都得自己去優化。你的 就是一個例子。void main int pa 3 a for int k 0 k 2 k ...

c指標的問題

首先,在指標定義時規定了ip是一個指向整形的指標,但是int ip 3 這句話讓ip指向3號地址塊,但是3號地址塊裡的內容是不確定的,所以是錯誤的 int ip 3 是不是這一步驟有問題?指標初始化不能這樣幹!include void main 這就對了。這時候ip指向a,而原先ip是指向3,而3是...