1.指針:
? ? 1.提供一種間接訪問數據的方法
? ? 2.空間沒有名字,只有一個地址編號
2.指針:
? ? 1.地址:區分不同內存空間的編號
? ? 2.指針:指針就是地址,地址就是指針
? ? 3.指針變量:存放指針的變量稱為指針變量,簡稱為指針
3.指針的定義:
? ? int *p = NULL;
? ? int *q = NULL;
? ? char *p = NULL;
? ? double *p = NULL;
? ? struct student *p = NULL;
? ? 野指針:指向隨機空間的指針
? ? 空指針:指向內存地址為0x0的空間的指針
? ? 注意:定義指針一定要初始化,防止成為野指針
4.指針的運算符:
? ? *: *p作為右值:獲得指針指向空間中的值?
? ? ? ?*p作為左值:將右值放入指針指向的空間
? ? &:獲得一個變量在內存空間中的首地址
5.指針的算數運算:
? ? +
? ? -
? ? ++
? ? --
? ? p+1:向內存高地址偏移指向的數據類型大小個字節空間
? ? p-q:兩個地址中間差了多少個指向的數據類型
? ??
6.不同類型的指針操作上有哪些不同
? ? char *p;
? ? int *p;
? ? double *p;
? ? struct student *p; ? ?
==================================================================================================================================================
1.指針數組和數組指針:
? ? 數組指針:
? ? ? ? int (*a)[5]
? ? ? ? 定義一個指針變量a,占8個字節空間,指向20個字節空間
? ? ? ? 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];
? ? ? ? 操作多個字符串時,通過將每個指針指向一個字符串開頭,完成對所有字符串的操作,使用指針數組
? ? ? ? 指針數組和二維數組的區別:
? ? ? ? ? ? 存儲字符串數組使用二維數組
? ? ? ? ? ? 操作字符串數組使用指針數組
指針和數組的關系:
? ? 1.指針和一維數組的關系:
? ? ? ? int a[5] = {1, 2, 3, 4, 5};
? ? ? ? int *p = NULL;
? ? ? ? p = &a[0];
? ? ? ? p = a;
? ? ? ? 數組的數組名是指向數組第一個元素的指針
? ? ? ? a == a[0]
? ? ? ? 訪問第n個元素:
? ? ? ? a[n] == *(a+n) == *(p+n) == p[n]
? ? 2.指針和二維數組的關系:
? ? ? ? int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
? ? ? ? int *p = NULL;
? ? ? ? int (*q)[3] = NULL;
? ? ? ? p = &a[0][0];
? ? ? ? p = a[0];
? ? ? ? p = *a;
? ? ? ? q = a;
? ? ? ? 數組的數組名a是指向數組第一行元素的數組指針
? ? ? ? 訪問第m行第n列元素方式(N是每行的列數):
? ? ? ? a[m][n]
? ? ? ? *(a[m]+n)
? ? ? ? *(*(a+m)+n)
? ? ? ? *(p+m*N+n)
? ? ? ? *(*(q+m)+n)
? ? ? ? *(q[m]+n)
? ? ? ? q[m][n]
? ? 3.指針操作字符串(字符串的遍歷)
? ? ? ? char str[32] = {"hello world"};
? ? ? ? char *p = NULL;
? ? ? ? p = str;?
? ? ? ? while (*p != '\0')
? ? ? ? {
? ? ? ? ? ? p++;
? ? ? ? }
函數指針和指針函數:
? ? 函數指針:
? ? ? ? int (*p)(int, int) = NULL;
? ? ? ? 定義一個指針變量p,p是指向一個int返回值且有2個int參數的函數的指針
? ? 指針函數:
? ? ? ? int *p(int a, int b)
? ? ? ? {
? ? ? ? }
? ? ? ? 定義一個函數,函數的返回值是指針
? ? ? ? 注意:
? ? ? ? ? ? 絕對不能返回局部變量的地址,否則函數調用結束后,會清除局部變量的空間(棧),應該返回例如數據區的地址,這樣函數調用結束后,仍可通過返回的地址訪問數據區的數據。