C語言中指針數(shù)組和數(shù)組指針的具體使用
指針數(shù)組和數(shù)組指針是C語言中高頻混淆的概念,核心區(qū)別在于本質(zhì)不同:
- 指針數(shù)組是“數(shù)組”(數(shù)組的每個(gè)元素都是指針),主要用來儲(chǔ)存數(shù)據(jù);
- 數(shù)組指針是“指針”(指針指向一個(gè)完整的數(shù)組),主要用來訪問數(shù)據(jù)。
一、指針數(shù)組
一個(gè)普通數(shù)組,但其每個(gè)元素的類型是指針(可以指向 int、char、結(jié)構(gòu)體等任意類型)。
1.語法格式
數(shù)據(jù)類型 *數(shù)組名[數(shù)組長度];
int *p[5]; // 指針數(shù)組:數(shù)組p有5個(gè)元素,每個(gè)元素是int*類型的指針 char *str[3];// 指針數(shù)組:數(shù)組str有3個(gè)元素,每個(gè)元素是char*類型的指針(常用于字符串)
關(guān)鍵:[ ] 優(yōu)先級高于 *,所以 p 先與 [ ] 結(jié)合,確定是數(shù)組,再由 * 確定數(shù)組元素是指針。
2.常見用法
存儲(chǔ)多個(gè)字符串(避免字符串?dāng)?shù)組的內(nèi)存浪費(fèi))、指向多個(gè)一維數(shù)組。
- 存儲(chǔ)多個(gè)字符串
字符串常量的本質(zhì)是字符數(shù)組的首地址,用 char * 指針數(shù)組存儲(chǔ)這些地址,高效且靈活。
#include <stdio.h>
int main() {
// 指針數(shù)組:每個(gè)元素指向一個(gè)字符串常量(首地址)
char *fruit[] = {"apple", "banana", "cherry", "date"};
int n = sizeof(fruit) / sizeof(fruit[0]); // 數(shù)組長度:4
// 遍歷指針數(shù)組,打印每個(gè)字符串
for (int i = 0; i < n; i++)
{
// fruit[i] 是指針,指向字符串首地址,%s 直接解析
printf("fruit[%d]: %s\n", i, fruit[i]);
}
return 0;
}輸出:
fruit[0]: apple
fruit[1]: banana
fruit[2]: cherry
fruit[3]: date
優(yōu)勢:字符串長度不同時(shí),指針數(shù)組僅存儲(chǔ)地址(4 字節(jié) / 個(gè)),比 char fruit[4][20](固定 20 字節(jié) / 個(gè))節(jié)省內(nèi)存。
- 指向多個(gè)一維數(shù)組
#include <stdio.h>
int main() {
int arr1[] = {1,2,3};
int arr2[] = {4,5,6};
int arr3[] = {7,8,9};
// 指針數(shù)組:每個(gè)元素指向一個(gè)int型一維數(shù)組
int *p_arr[] = {arr1, arr2, arr3};
// 遍歷:通過指針數(shù)組訪問每個(gè)一維數(shù)組的元素
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
// p_arr[i] 是數(shù)組首地址,p_arr[i][j] 等價(jià)于 *(p_arr[i] + j)
printf("%d ", p_arr[i][j]);
}
printf("\n");
}
return 0;
}輸出:
1 2 3
4 5 6
7 8 9
二、數(shù)組指針
一個(gè)指針變量,專門指向一個(gè)完整的數(shù)組(而非數(shù)組的單個(gè)元素)。
- 對一維數(shù)組的數(shù)組名
- &:值不變,類型升級為數(shù)組指針,即第一行元素的指針。
- * :地址值不變,類型降級,指向數(shù)組中第一個(gè)元素的指針。
一維數(shù)組的數(shù)組名是指向第一個(gè)元素的指針。數(shù)組名+1,步進(jìn)值是 sizeof(基類型) 的大小。
二維數(shù)組的數(shù)組名是指向第一行第一個(gè)元素的指針。數(shù)組名+1,步進(jìn)值是一行的大小。

1.語法格式
數(shù)據(jù)類型 (*指針名)[數(shù)組長度];
int (*p)[5]; // 數(shù)組指針:p是指針,指向一個(gè)「int[5]類型」的數(shù)組 char (*q)[10]; // 數(shù)組指針:q是指針,指向一個(gè)「char[10]類型」的數(shù)組
關(guān)鍵:必須加括號 (),強(qiáng)制 p 先與 * 結(jié)合,確定是指針,再由 [5] 確定指向的數(shù)組類型(int [5])。
2.常見用法
指向二維數(shù)組、作為函數(shù)參數(shù)接收二維數(shù)組(避免二維數(shù)組傳參退化問題)。
- 指向二維數(shù)組并遍歷
#include <stdio.h>
int main() {
// 二維數(shù)組:3個(gè)元素,每個(gè)元素是int[5]類型的一維數(shù)組
int arr[3][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
// 數(shù)組指針:p指向int[5]類型的數(shù)組(與二維數(shù)組的元素類型匹配)
int (*p)[5] = arr;
// 遍歷二維數(shù)組(3種等價(jià)寫法)
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
// 寫法1:p[i][j](最直觀,等價(jià)于二維數(shù)組訪問)
// 寫法2:*(p[i] + j)(p[i]是第i個(gè)一維數(shù)組的首地址)
// 寫法3:*(*(p + i) + j)(p+i指向第i個(gè)一維數(shù)組)
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
return 0;
}輸出:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
核心邏輯:arr 是二維數(shù)組首地址(指向 arr [0],即第一個(gè) int [5] 數(shù)組),與數(shù)組指針 p 的類型完全匹配,因此 p = arr 合法。
- 作為函數(shù)參數(shù)接收二維數(shù)組
#include <stdio.h>
// 函數(shù)參數(shù):用數(shù)組指針接收二維數(shù)組(int[3][5]退化為int(*)[5])
void print2DArray(int (*p)[5], int row)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
// 傳參:直接傳入二維數(shù)組名(退化為數(shù)組指針)
print2DArray(arr, 3);
return 0;
}輸出:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
注意:函數(shù)參數(shù)中 int (*p)[5] 等價(jià)于 int p[ ][5](兩者都是數(shù)組指針的簡寫),但不能寫成 int *p[5](這是指針數(shù)組,類型不匹配)。
到此這篇關(guān)于C語言中指針數(shù)組和數(shù)組指針的具體用法的文章就介紹到這了,更多相關(guān)C語言 指針數(shù)組和數(shù)組指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)模擬USB對8bit數(shù)據(jù)的NRZI編碼輸出
今天小編就為大家分享一篇關(guān)于C語言實(shí)現(xiàn)模擬USB對8bit數(shù)據(jù)的NRZI編碼輸出,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
C語言的隨機(jī)數(shù)rand()函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語言的隨機(jī)數(shù)rand()函數(shù),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
VS中scanf為何會(huì)報(bào)錯(cuò)詳解
在我們剛使用vs時(shí),在使用scanf函數(shù)時(shí)常會(huì)遇到報(bào)錯(cuò)提醒,下面這篇文章主要給大家介紹了關(guān)于VS中scanf為何會(huì)報(bào)錯(cuò)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解
這篇文章主要介紹了C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
C++實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++語言實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C++實(shí)現(xiàn)并優(yōu)化異常系統(tǒng)
異常處理是C++的一項(xiàng)語言機(jī)制,用于在程序中處理異常事件,下面這篇文章主要給大家介紹了關(guān)于C++中異常的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

