指針的主要作用:提供一種間接訪問數據的方法
? ? 1.地址:區分不同內存空間的編號
????2.指針:指針就是地址,地址就是指針
????3.指針變量:存放指針的變量稱為指針變量,簡稱為指針
1.指針的定義
????int?*p?=?NULL;
????int?*q?=?NULL;
????char?*p?=?NULL;
????double?*p?=?NULL;
????struct?student?*p?=?NULL;
????野指針:指向隨機空間的指針
????空指針:指向內存地址為0x0的空間的指針
????注意:定義指針一定要初始化,防止成為野指針?
2.指針的運算
???* :?*p作為右值:獲得指針指向空間中的值?
???????*p作為左值:將右值放入指針指向的空間
???&? :獲得一個變量在內存空間中的首地址
???p+1:向內存高地址偏移指向的數據類型大小個字節空間
????p-q:兩個地址中間差了多少個指向的數據類型
3.指針數組和數組指針
數組和指針用法的區別:
- 存儲數據使用數組
- 操作數據使用指針
數組指針:
? ? ? ? 對比 int? (*a)[5]; 和? int a [5];
? ? ??
int (*a)[5]
:
- 這是一個指針,指向一個包含5個整數的數組。
a
?是一個指針,指向一個包含5個整數的數組,可以通過?*a
?訪問這個數組。- 定義一個指針變量 a, 占8個字節空間,指向20個字節空間
????????int?a[5]?=?{1,?2,?3,?4,?5};
- 這是一個包含5個整數的一維數組。
a
?是一個包含5個整數的數組,可以直接通過下標訪問數組元素。- 這種聲明適用于一維數組,用于存儲一組整數值。
int a[5] ={1,2,3,4,5};
????????a?==?&a[0]?==?int?*
數組名本質上是一個指向數組第一個元素的指針常量
? ? ?
? 數組名需要注意的點? ?:? 大部分情況下 a 可以理解為int*型,有2種特殊情況除外
????????????1.sizeof運算時??
????????????????sizeof(a):?20
????????????????sizeof(int?*):?8
????????????2.&運算符
????????????????&a:? ?int?(*)[5]
????????????????&int?*:?int?**?
????????數組指針特點:
????????????1.對一維數組,數組名&得到數組指針,值不變,類型升級為指向整個數組的指針
????????????2.對數組指針*,值不變,類型降級為指向數組第一個元素的指針
指針數組?
?int?*a[5];
????????定義一個數組a,有5個元素,每個元素為int?*型,占40個字節空間
????????char?*pstr[5];
????????操作多個字符串時,通過將每個指針指向一個字符串開頭,
????????完成對所有字符串的操作,使用指針數組
????????指針數組和二維數組的區別:
????????????存儲字符串數組使用二維數組
????????????操作字符串數組使用指針數組
#include <stdio.h>int main(void)
{int *p = NULL;int a[5] = {1, 2, 3, 4, 5};p = a + 2;printf("*p1 = %d\n", *p);p = (int *)(&a + 1) - 1;printf("*p2 = %d\n", *p);return 0;
}
運行結果為:?