簡單回顧一下指針的概念
內存會劃分以字節為單位的空間,每一個字節都有一個編號(地址/指針)
指針變量可以存放這個地址/指針
注:我們日常所說的指針,一般是指針變量
下面讓我們坐上指針進階的直通車,來到第一站!字符指針
字符指針
代碼示例:
int main(){ char ch = 'w'; char* p= &ch; char* pa = "abcdef"; return 0;}
字符變量ch里面存放了字符w
字符指針p里面存放了ch的地址
指針變量pa里面存放了abcdef字符串的地址,我們并沒有對這個字符串進行初始化。而是直接把它放進了指針變量pa里面。
和前兩行的字符w不同,abcdef是存儲在內存中的只讀數據區,無法修改,即便通過指針也無法修改。
為了避免理解出錯,我們一般會加上const修飾
const char* pa = "abcdef";
const放在*的左邊
表示const修飾的指針指向的內容,表示指針指向的內容不能通過指針來改變
但是指針變量本身是可以改變的
const放在*的右邊
表示const修飾的是指針變量本身,指針變量的內容不能被修改
但是*pa指針指向的內容是可以通過指針來修改的
代碼示例:
int main(){ char arr1[] = "abcdef"; char arr2[] = "abcdef"; const char* str1 = "abcdef"; const char* str2 = "abcdef"; if (arr1 == arr2) printf("arr1==arr2 "); else printf("arr1!=arr2 "); if (str1 == str2) printf("str1==str2 "); else printf("str1!=str2 "); return 0;}
它的結果如下:
在例子1里面我們提到過,str1和str2這種情況都指向一個常量字符串
既然字符串abcdef無法被改變,編譯器也沒有必要創建兩個獨立的內存空間來存放兩個相同的字符串
所以str1和str2的地址是完全一樣的
而arr1和arr2是完全不同的數組,它們的首元素地址不一樣,打印的結果是不相等
typedef關鍵字
如何使用:
在MSDN中,我們可以查找到typedef的定義
簡單地說,typedef的作用就是把一個已有的類型名換一個新的名字
typedef int* pint;
這句代碼的意思是:將int*命名為pint
pint在使用的時候和int*完全一致
我們仍然可以使用int*
在結構體里面,我們可以用typedef來縮短原有結構體定義的語句
如:將struct Stu命名為Stu
typedef和#define的區別
我們同樣可以使用#define語句,進行這項操作
#define PINT int*
定義語句PINT為int*
指針連續定義
先來了解一下如何正確連續定義兩個指針
int*pa,*pb;//正確的連續定義 int*pa,pb;//錯誤//pa是int*類型,而pb是int類型
因為這兩個的情況非常容易搞混,所以我們不建議連續定義指針
typedef int* pint;#define PINT int* int main(){ pint pa,pb;//可連續定義指針 //pa-->int* //pb-->int* PINT pa,pb;//等同于int*pa,pb //pa-->int* //pb-->int}
·typedef會產生一個新的變量類型
·#define只是在對應位置進行替換
因為typedef產生了一個新的類型,pint為int*,但與int*也有不同
int pa,pb;//pa,pb都是int類型pint pa,pb;//pa,pb都是int*類型
而我們直接用int*進行連續定義指針變量是錯誤的
int*pa,pb;//錯誤//pa是int*類型,而pb是int類型
你學會了嗎?我反正是學廢了。
-
數據
+關注
關注
8文章
7031瀏覽量
89039 -
指針
+關注
關注
1文章
480瀏覽量
70564 -
代碼
+關注
關注
30文章
4788瀏覽量
68617
原文標題:【C語言】指針進階第一站:字符指針 & typedef關鍵字!
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論