簡單回顧一下指針的概念
內存會劃分以字節(jié)為單位的空間,每一個字節(jié)都有一個編號(地址/指針)
指針變量可以存放這個地址/指針
注:我們日常所說的指針,一般是指針變量
下面讓我們坐上指針進階的直通車,來到第一站!字符指針
字符指針
代碼示例:
int main(){ char ch = 'w'; char* p= &ch; char* pa = "abcdef"; return 0;}
字符變量ch里面存放了字符w
字符指針p里面存放了ch的地址
指針變量pa里面存放了abcdef字符串的地址,我們并沒有對這個字符串進行初始化。而是直接把它放進了指針變量pa里面。
和前兩行的字符w不同,abcdef是存儲在內存中的只讀數據區(qū),無法修改,即便通過指針也無法修改。
為了避免理解出錯,我們一般會加上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無法被改變,編譯器也沒有必要創(chuàng)建兩個獨立的內存空間來存放兩個相同的字符串
所以str1和str2的地址是完全一樣的
而arr1和arr2是完全不同的數組,它們的首元素地址不一樣,打印的結果是不相等
typedef關鍵字
如何使用:
在MSDN中,我們可以查找到typedef的定義

簡單地說,typedef的作用就是把一個已有的類型名換一個新的名字
typedef int* pint;
這句代碼的意思是:將int*命名為pint
pint在使用的時候和int*完全一致
我們仍然可以使用int*
在結構體里面,我們可以用typedef來縮短原有結構體定義的語句
如:將struct Stu命名為Stu

typedef和#define的區(qū)別
我們同樣可以使用#define語句,進行這項操作
#define PINT int*
定義語句PINT為int*
指針連續(xù)定義
先來了解一下如何正確連續(xù)定義兩個指針
int*pa,*pb;//正確的連續(xù)定義 int*pa,pb;//錯誤//pa是int*類型,而pb是int類型
因為這兩個的情況非常容易搞混,所以我們不建議連續(xù)定義指針
typedef int* pint;#define PINT int*
int main(){ pint pa,pb;//可連續(xù)定義指針 //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*進行連續(xù)定義指針變量是錯誤的
int*pa,pb;//錯誤//pa是int*類型,而pb是int類型
你學會了嗎?我反正是學廢了。
-
數據
+關注
關注
8文章
7349瀏覽量
95053 -
指針
+關注
關注
1文章
484瀏覽量
71970 -
代碼
+關注
關注
30文章
4977瀏覽量
74416
原文標題:【C語言】指針進階第一站:字符指針 & typedef關鍵字!
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
指針的概念
評論