p++

問題:

請分析下面代碼的輸出結果:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
int main()
{   
        char*p1 = "China";
        char*p2, *p3;
 
        p2= (char*)malloc(20);
        memset(p2,0, 20);
        while(*p2++= *p1++);
        printf("%s\n",p2);
        getchar();
}

輸出結果:輸出爲空!

 

代碼的本意是將p1字符串的字符複製到p2指針所指向的內存區域。但是在語句while(*p2++ = *p1++);中,在指針p1增加的時候,指針p2也跟着增加了。所以實際上在賦值之後,p2也指向了“China”字符串的下一個地址處。

 

總結:

 

1. p指針的幾種操作

++(*p):先取出p指針所指向的內容,然後自增1,當前生效;

(*p)++:先取出p指針所指向的內容,然後自增1,該語句執行後生效;

*(p++):p指針+1,取出+1之前指針指向的內容;

*(++p):p指針+1,取出+1後指針指向的內容。

 

2. malloc函數

Malloc 向系統申請分配指定size個字節的內存空間。返回類型是void* 類型。void*表示未確定類型的指針。C,C++規定,void*類型可以強制轉換爲任何其它類型的指針。

2.1 功能

分配長度爲num_bytes字節的內存塊。

2.2 返回值

如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。

2.3 說明

關於該函數的原型,在舊的版本中malloc返回的是char型指針,新的ANSIC標準規定,該函數返回爲void型指針,因此必要時要進行類型轉換。

2.4 名稱解釋

malloc的全稱是memoryallocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。

2.5 頭文件

<stdlib.h>

 

3. memset函數

將s所指向的某一塊內存中的每個字節的內容全部設置爲ch指定的ASCII值, 塊的大小由第三個參數指定,這個函數通常爲新申請的內存做初始化工作, 其返回值爲指向S的指針。

3.1 函數介紹

void *memset(void *s, int ch, size_t n);

3.2函數解釋

將s中前n個字節(typedefunsigned int size_t)用 ch 替換並返回s 。

3.3 函數作用

在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法。

3.4 頭文件

<string.h>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章