??博客主頁: 小羊失眠啦.
??系列專欄: C語言
???每日語錄:苦難是化了妝的祝福。
??感謝大家點贊??收藏?評論??
前言
時隔多日小羊又來給鐵汁們更新C語言之初識指針,指針是C語言中一個關鍵且強大的概念,理解和掌握指針對于編寫高效、靈活的程序至關重要。本文將詳細解釋C語言中的指針,幫助初學者邁出掌握編程世界的第一步。
一、指針是什么?
- 指針是內(nèi)存中一個最小單元的編號,也就是地址
- 一般我們所說的指針,通常是指指針變量,用來存放內(nèi)存地址的變量
1.內(nèi)存
程序在運行時候會在內(nèi)存中被調用,運行時占用內(nèi)存的空間。
內(nèi)存就像一棟樓,里面有很多房間,每一戶人家(每一塊內(nèi)存)都有一個門牌號,而這個門牌號就相當于內(nèi)存編號,我們就可以通過編號找到相對應的內(nèi)存(值)。
編號也被稱為地址,不同內(nèi)存塊所對應的地址也不一樣。
2.指針變量
指針變量也是一種變量,只不過是用來存儲地址的變量我們可以通過&(取地址操作符)取出變量的內(nèi)存起始地址,把該地址存放到一個變量中,這個變量就是指針變量
#include<stdio.h>
int main()
{
int a = 5;
int* p = &a;//取出a的地址存放到變量p中
printf("%p\n", &a);
printf("%p", p);
return 0;
}
總結:指針是一個變量,但它存儲的是另一個變量的內(nèi)存地址,而不是直接存儲數(shù)據(jù)本身。可以將指針看作是數(shù)據(jù)的"門牌號碼",通過它可以找到內(nèi)存中存儲的實際數(shù)據(jù)。
3.指針大小
在32位電腦上,地址是32個0或者1組成二進制序列,那地址就是32b(位)=4B(字節(jié))的空間來存儲,所以一個指針變量的大小就是4個字節(jié)。
相應的在64位機器上,64b=8B,一個指針變量大小就是8個字節(jié)。
總結:1. 指針是用來存放地址的,地址是唯一標識一塊內(nèi)存單元的。
2. 指針大小在32位平臺上是4個字節(jié),在64位平臺是8個字節(jié)。
二、指針類型
指針變量是變量,變量有很多類型,那指針變量的類型也是如此。
當我們需要指向不同類型的變量時,就需要創(chuàng)建不同類型的指針變量。
char* p1 = NULL;//創(chuàng)建一個char類型的指針,并初始化為空指針
int* p2 = NULL;//創(chuàng)建一個int類型的指針,并初始化為空指針
short* p3 = NULL;
long* p4 = NULL;
float* p5 = NULL;
double* p6 = NULL;
所以指針的定義方式為:類型 + * = 值。
解讀:
-
char*
類型指針是為了存放char
類型變量的地址 -
int*
類型指針是為了存放int
類型變量的地址 -
double*
類型指針是為了存放double
類型變量的地址
注意:指針大小與指針類型無關,指針大小與計算機(32位或者64位有關)
1.指針類型的作用
從上面代碼可知,不同類型指針大小相同,那么指針類型的意義是什么呢?
用法示例
#include <stdio.h>
int main()
{
int n = 10;
char* p1 = (char*)&n;//將int類型地址強制轉化為char類型
int* p2 = &n;
printf("%p\n", &n);
printf("%p\n", p1);
printf("%p\n", p1 + 1);
printf("%p\n", p2);
printf("%p\n", p2 + 1);
return 0;
}
我們發(fā)現(xiàn):
當指針為char類型時,指針+1,步長為1
當指針為int類型時,指針+1,步長為4
總結:不同類型的指針變量決定了指針向前或向后走一步有多大(距離),即步長。
2.指針的解引用
我們知道,指針保存內(nèi)存的地址,那指針的作用是什么呢?
我們可以通過指針保存的地址,來訪問內(nèi)存中的目標變量,并將其修改,這就需要使用指針的解引用操作。
用法示例
#include <stdio.h>
int main()
{
int n = 0x11223344;
char* p1 = (char*)&n;
int* p2 = &n;
*p1 = 0;
*p2 = 0;
printf("%#x\n", n);
printf("%#x\n", p1);
return 0;
}
分析:
因為p2是int類型指針變量,所以能訪問四個字節(jié)的空間,*p2=0,將n的值修改為0;
但是p1是char類型指針變量,所以只能訪問一個字節(jié)的空間,那為何又是修改地址中的44而不是11呢,后面文章會詳解大小端的知識。
總結:
- 指針的類型決定指針加減整數(shù)時所跳過的步長
指針的類型決定了,對指針解引用的時候有多大的權限(能操作幾個字節(jié))
三、野指針
概念:野指針就是指針的位置是不可知的(隨機的、不正確的、沒有正確限制的)指針。
野指針很危險,它訪問的空間不可知,從而導致出現(xiàn)的可能情況有:
- 指針未初始化
- 指針越界或者非法訪問
- 指針指向的空間被釋放了(例:局部變量)
用法示例
#include <stdio.h>
int main()
{
//1>:
int* p1;
*p1 = 5;
//此時p1就是一個野指針。
//2>:
int arr[10] = { 0 };
int i = 0;
int* p2 = arr;//p指向數(shù)組的首地址
for (i = 0; i < 11; i++)
{
*(p2++)=i;
}
//當p2指向的空間超過數(shù)組的最后一個元素時,指針就非法訪問,即越界訪問了未知空間。
//此時p2是野指針。
//3>:
int j = 0;
for (j = 0; j < 5; j++)
{
int a = 5;
a += 1;
}
int* p3 = &a;//當循環(huán)結束之后,局部變量a向內(nèi)存申請的空間就被釋放了。
//此時p3指針指向的空間就是已經(jīng)被釋放掉的空間。p3就是野指針。
return 0;
}
如何規(guī)避野指針
- 指針初始化
- 小心指針越界
- 指針指向空間釋放及時置NULL
- 避免返回局部變量的地址
- 指針使用之前檢查有效性
四、指針的運算
1.指針加減整數(shù)
用法示例
例:打印一維數(shù)組
#include<stdio.h>
int main()
{
int arr[5] = { 1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int* p = arr;
for (i = 0; i < 5; i++)
printf("%d ", *p + i);
return 0;
}
2.指針-指針
指針減指針可以用來計算字符數(shù)組的長度或字符串的長度
用法示例
#include <stdio.h>
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
p++;
return p - s;
}
int main()
{
char str[] = "hello world";
int len = my_strlen(str);
printf("%d", len);
return 0;
}
3.指針的關系運算
標準規(guī)定:
允許指向數(shù)組元素的指針與指針數(shù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個內(nèi)存位置的指針進行比較。
五、二級指針
指針變量也是變量,變量有地址,那么指針變量的地址存放在哪里?
這時候就來了解二級指針!
#include <stdio.h>
int main()
{
int a = 10;
int* p1 = &a;
int** p2 = &p1;//p2就是二級指針,指向p1
**p2 = 6;
printf("%d", a);
return 0;
}
a的地址存放在p1中,p1的地址存放在p2中p1是一級指針,而p2是二級指針
**p2=6通過第一次解引用找到p1,再第二次解引用找到a,將其修改為6
以此還有三級指針和其他多級指針,常見的就是一級和二級指針
指針的注意事項
- 指針操作前應該初始化,避免出現(xiàn)未定義行為。
- 指針可以進行比較操作,但僅在指向同一數(shù)組中的元素時才有意義。
- 避免野指針(指向未知內(nèi)存區(qū)域的指針)的使用,這可能導致程序崩潰。
結論:
初學者理解指針是學習C語言的重要一步,它使得程序可以更加靈活和高效地操作內(nèi)存。通過掌握指針的基本概念、操作和用途,可以構建出更加復雜和強大的C語言程序。逐步練習并在實際項目中應用指針,將有助于加深對指針的理解和熟練掌握。文章來源:http://www.zghlxwxcb.cn/news/detail-639536.html
小羊希望本文對初學者理解C語言中的指針概念提供了一些幫助。在進一步學習過程中,還請查閱相關文檔和示例以加深理解,咱們下期再見~~文章來源地址http://www.zghlxwxcb.cn/news/detail-639536.html
到了這里,關于『C語言初階』第七章 -初識指針的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!