前言:
在C語言學(xué)習(xí)過程中,指針?biāo)阋粋€難點。我總結(jié)所學(xué)的指針知識,寫一篇博客,希望大家對指針的知識理解的更通透。
一、指針是什么?
1.1 指針是什么?
每個內(nèi)存都有一個唯一的編號,這個編號也被稱為地址,C語言創(chuàng)建變量。都要在內(nèi)存上開辟空間。
編號= = 地址 = =指針
1.2 指針變量
我們可以通過&(取地址操作符)取出變量的內(nèi)存起始地址,把這個地址存放到另一個變量中。
1.3 總結(jié)
指針變量,用來存放地址的變量。(存放在指針中的值都被當(dāng)成地址處理)
編址:
對于32位機器,假設(shè)有32根地址線,那么每根地址線在尋址的時候產(chǎn)生高電平(高電壓)和低電平(低電壓)就是。(1或者0)
在32位機器上,地址是32個1或者0組成的二進制序列,指針變量的大小4個字節(jié)。(指針的大小在32位平臺上是4個字節(jié),64位平臺上是8個字節(jié))
二、指針和指針類型
指針有類型。
指針的定義:type * p
type:p指向?qū)ο蟮念愋?/font>
*:p解引用訪問的對象的大小是sizeof(type)
p是指針變量
例子:
char * 類型的指針是為了存放 char *類型變量的地址。
short * 類型的指針是為了存放 short *類型變量的地址。
int * 類型的指針是為了存放 int *類型變量的地址。
2.1指針±整數(shù)
指針的類型決定了指針向前或者向后走一步有多大。
整型指針+1跳過4個·字節(jié)
字符指針+1跳過1個字節(jié)
type*p -/+n個步長
跳過的是n * sizeof(type)個字節(jié)
2.2 指針的解引用
指針的類型決定了,對指針解引用的時候有多大權(quán)限(能操作幾個字節(jié))
如:char * 的指針解引用只能訪問一個字節(jié),而int * 的指針解引用能訪問4個字節(jié)。
三、野指針
野指針是指向未分配或者已經(jīng)釋放的內(nèi)存地址。
3.1野指針的成因
- 指針未初始化
#include <stdio.h>
int main()
{
int* p;//局部變量指針未初始化,默認為隨機值,是野指針
*p = 20;
return 0;
}
- 指針越界訪問
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i < 11; i++)
{
*p++ = i;//當(dāng)指針指向的范圍超出數(shù)組的范圍時,p就是野指針(非法訪問了)。
}
return 0;
}
3) 指針指向的空間被釋放
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* p = NULL;//p是空指針
p = (char*)malloc(sizeof(char));//創(chuàng)建一個內(nèi)存地址,并且使p指向它
free(p);//釋放了p的內(nèi)存地址
char* p1 = p;//p1是野指針,因為p的內(nèi)存地址被釋放了
return 0;
}
3.2如何避免野指針
- 指針初始化
明確知道指針應(yīng)該初始化為誰的地址,就直接初始化為誰的地址;不知道指針初始化為誰的值,就暫時初始化為NULL。 - 小心指針越界
- 指針指向空間釋放,及時置NULL
- 避免返回局部變量的地址
- 指針使用之前檢測有效性
四、指針運算
指針±整數(shù)
指針-指針
指針的關(guān)系運算
4.1 指針±整數(shù)
float arr[10]={0};
float* p=&arr[0]
*p++=0;//把0賦值給p指向的那個值,結(jié)束后把p的指向的那個地址向后移4個字節(jié)
4.2指針-指針
int arr[10];
printf("%d ",&arr[9]-&arr[0]);//打印的是9
指針-指針得到的數(shù)值的絕對值是指針和指針之間的元素個數(shù);
指針-指針運算的前提條件是:指針和指針指向了同一塊空間。
4.3指針的關(guān)系運算
指針與指針之間的比較
標(biāo)志規(guī)定:
允許指向數(shù)組元素的指針與指向數(shù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個內(nèi)存位置的指針進行比較。
五、指針和數(shù)組
指針和數(shù)組之間的關(guān)系:
指針變量就是指針變量,不是數(shù)組,指針變量的大小是4/8個字節(jié),專門用來存放地址的。
數(shù)組就是數(shù)組,不是指針,數(shù)組是一塊連續(xù)的空間,可以存放一個或者多個類型相同的數(shù)據(jù)。
聯(lián)系:數(shù)組中,數(shù)組名其實是數(shù)組首元素的地址。
數(shù)組名 == 地址 == 指針
當(dāng)我們知道數(shù)組首元素地址的時候,因為數(shù)組是連續(xù)存放的,所以通過指
- 針就可以遍歷訪問數(shù)組。
- 數(shù)組是可以通過指針來訪問的。
數(shù)組名是首元素地址,但是有兩個例外:
- sizeof(數(shù)組名)整個數(shù)組的長度 &數(shù)組名
- 指向整個數(shù)組的指針,移動一次,移整個數(shù)組的字節(jié)。
所以p+i其實計算的是數(shù)組arr下標(biāo)為i的地址,那么我們可以通過指針來訪問數(shù)組。
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int* p = arr;//指針存放數(shù)組首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i;
for (i = 0; i < sz; i++)
printf("%d ", *(p + i));
return 0;
}
六、二級指針
a的地址存放在pa中,pa的地址存放在p中;pa是一級指針,p是二級指針。
*p通過對p中的地址解引用,這樣就得到了pa, *p其實訪問的就是pa。
**p先通過 * p找到pa,然后對pa進行解引用操作:*pa,就是找到a。
七、指針數(shù)組
整型數(shù)組——存放整型的數(shù)組
字符數(shù)組——存放字符的數(shù)組
指針數(shù)組——存放指針的數(shù)組
指針數(shù)組是什么樣的?
int* arr[5]
arr是一個數(shù)組,存放5個元素,每個元素是一個整型指針文章來源:http://www.zghlxwxcb.cn/news/detail-575427.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-575427.html
到了這里,關(guān)于C語言——指針詳解(初階)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!