對C語言一些個人見解系列 指標和一維陣列的關係

2021-06-20 02:41:49 字數 1922 閱讀 7708

1.指標的定義和宣告

我認為定義乙個指標,本質來說,就是在定義乙個變數。只是這個變數,不是拿來存在乙個具體的數字。而是存放乙個位址(指標指向的地方)。

比如說:int a=4;表示的是宣告乙個整數型的變數,在記憶體內開闢了乙個int型大小的記憶體空間,存放著4這個數字。而這個記憶體空間有個系統分配的位址來標註它。

int* b=&a;這個我們可以把int*看成乙個整體,它宣告了乙個指標變數b,用來存放了整形變數a所在的位址。因此,指標變數b指向了a的位址空間。

所以,從這裡我們可以看出,指標存放的是乙個位址,而不是單純的乙個數字。

**:

#includeint main()
從這個程式我們可以看出來,在螢幕列印出來的值都是對應相等。即,b指向了a的位址空間。

2.指標和一維陣列

首先,陣列本質是個常數指標,即指向是不能改變的。

比如說:char str[5]={};

str="abcd";

這樣寫是不對的,這樣相當於改變了陣列的指向。

我們來看一段**:

#includeint main();

printf("str=%p\n",str);//str=0022fea8

printf("&str[0]=%p\n",&str[0]);//&str[0]=0022fea8

printf("str+1=%p\n",str+1);//str+1=0022feac

printf("*str=%d\n",*str);//*str=1

printf("str[0]=%d\n",str[0]);//str[0]=1

printf("*(str+1)=%d\n",*(str+1));//*(str+1)=2

printf("str+5-str=%d\n",str+5-str);//str+5-str=5

printf("(int)(str+5)-(int)str=%d\n",(int)(str+5)-(int)str);//(int)(str+5)-(int)str=20

printf("(short*)(str+5)-(short*)str=%d\n",(short*)(str+5)-(short*)str);//(short*)(str+5)-(short*)str=10

printf("(char*)(str+5)-(char*)str=%d\n",(char*)(str+5)-(char*)str);//20

我們先看空格上面的**:

1.我們可以看到str=&str[0]=0022fea8,說明陣列名可以作為陣列的首位址,也就是str[0]的位址。

2.而*(str+1)=2=str[1],而且str+1與str相差4,說明所謂位址的加1,並不僅僅是數字上的+1,而是+1個int型的大小(4)。

3.比如:*((int*)(&str+1)-1)=6,因為對&str對一維陣列取位址,可以直接理解為變成乙個二維陣列,因此對二維陣列的位址+1,相當加上乙個一維陣列的長度,然後在通過int* 將它強制轉換成一維陣列,再-1,就相當與減乙個int型的長度,因此等於6.

4.對於一維陣列位址的相減,我們不能簡單的理解成,兩個數簡單的算數相減,而是要帶單位的相減。

就如程式裡面的int型的大小是4,short的大小是2,char的大小是1。因此,可以用乙個公式概括:

[a(位址1)-b(位址2)]/(int或short或char的大小),因此,得出才會是5,10和20

而為什麼

(int)(str+5)-(int)str=20呢?

因為(int)直接將位址直接強制轉換成int型資料,而不再是乙個位址,而是乙個簡簡單單的資料。而這個數本來就相差20,所以結果也就是20.

/********************以上純屬個人理解**********************/

/*********如果有錯誤的地方,希望能夠指點一下*********/

Task 的一些個人見解

task確實比較好用且優雅 我感覺.net要成為藝術家.public class thetask console.writeline task函式完成 return ta 直接呼叫時非同步方法 public async task taskasync console.writeline task函式完...

對MQTT和CoAP的一些個人見解

mingdu.zhengatgmail dot com 首先,mqtt和coap沒有好不好的問題,只有適合什麼應用場景的問題。mqtt的特點是可以保持長連線,具有一定的實時性,雲端向裝置端傳送訊息,裝置端可以在最短的時間內接收到並作出響應,所以mqtt更適合需要實時控制的場合,更適合執行器。要保持長...

關於專案管理的一些個人見解

在專案開發中,如果專案經理管理得當,會按時甚至提前完成開發任務,否則,則有可能延誤開發任務。我認為在專案開發中應該注意一下幾點 1 規範 專案組在開始時候,應該制定一套程式設計規範,所有成員必須按照程式設計規範進行編碼。2 使用成熟的技術 使用新技術可能會提高開發進度,但是新技術會有較高的風險,專案...