1>指針分類:
(1)強指針:默認情況下,都是強指針(__strong)
(2)弱指針: __weak 修飾
指針:指針是一個地址,我們可以通過獲取地址來操控此地址中存儲空間的值。
2>指針變量
作用:只能存放地址(指針變量佔用8個字節存儲空間),能夠根據地址值訪問存儲空間,並修改存儲空間的值。
*p代表訪問p的存儲空間(p是指針)
int *p;
p=&b; //代表指針p存儲變量的b地址 指針變量p指向b
(指針變量可以先定義後賦值也可以定義的同時賦值)
(定義指針類型時不可亂用類型,應與被指向變量類型一致)
3>指針訪問的空間大小
指針訪問的空間大小隻與指針的返回值有關,和變量沒關係。
eg: chara='A'; //代表指針p訪問的空間大小爲1個字節。
int *p=&a; //代表指針p訪問的空間大小爲4個字節。
p=p2; //代表指針p2的地址複製給指針p,指針p將指向指針p2所指向的存儲空間
4>指針和數組
4.1內存區分部分:
常量區:存放一些常量字符串,會將結果緩存,結果無法更改。
堆:存放對象,需要自己創建對象。類似我們自己做菜炒飯。
棧:存放局部變量 ,直接調用程序中有的。類似在酒店點菜喫飯,不需要自己做
靜態區:存放全局變量和靜態變量。
4.2指針與數組
我們可以通過指針操作數據。
eg:
ag[]={6,8,2,5,1};
int*p=&ag[0]; //或者p=ag;
/*
p-->&ag[0]
p+1-->&ag[1]
p+2 -->&ag[2]
p+i-->&ag[i]
*/
指針加1代表指針指向下一個數組地址(1具體的字節數取決指針類型,eg:int類型就加4,char類型就加1)。
5>數組元素的訪問方式
1>數組名[下標] ages[i]
2>指針名[下標] p[i]
3>*(p+i)
6>指針與字符串
6.1.定義字符串的兩種方式
6.1.1利用數組定義:
charname[]="itcat";
char name2[]="itcat"; //開閉新的內存存儲空間
特點:字符串裏的字符可以修改。此值放在棧內,屬於字符串變量
使用場合:字符串內容需要經常修改。
6.1.2 利用指針:
char*name="itcast";
char*name2="itcast"; //使用*name的存儲空間,不會新增存儲空間,指針name2指向第一個字符的地址,既字符i的地址
特點:字符串其實是一個常量字符串,裏面的字符無法修改,因爲此值放在常量區內,會將此值緩存,屬於字符串常量
使用場合:字符串內容不需要修改,且字符串內容要經常使用
7>指針與函數
7.1 指向函數的指針
int(*p)(); //代表指針p指向一個函數,函數的返回值是int類型
例:
void (*p)(); //指針名p 指向一個函數
p=test; //test是函數名 ,函數名就相當於地址(整個函數的入口)
(*p)(); //調用指針所指向的存儲空間
調用方法:
a> (*p)(); //調用指針所指向的存儲空間
b> test(); //直接使用函數名調用
7.2 返回指針的函數
int*test(); //代表test函數返回的是指針(也就是返回地址)
8>清空指針
p = 0;
p = NULL;
9>數組指針和指針數組
指針數組是指針的數組,裏邊的內容是指針;
例:
int*p[4]; // 指向4個int類型的指針
數組指針是指向數組的指針,具體一點是指向數組的第一個元素,指針每加一便指向數組的下一個元素
10> int const *p和int *const p的區別
int const *p: 1) const修飾的是*p,因此*p 是常量,不能通過*p 修改p所指向的存儲空間的值
2)P是變量,可以被賦值,p所指向的地址可以變化。
int *const p:1)p是常量,其所指向的地址不能變化。
2)*p是變量,其所指向的存儲空間的值可以變化