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

1.語法格式
數(shù)據(jù)類型 (*指針名)[數(shù)組長度];
int (*p)[5]; // 數(shù)組指針:p是指針,指向一個「int[5]類型」的數(shù)組 char (*q)[10]; // 數(shù)組指針:q是指針,指向一個「char[10]類型」的數(shù)組
關(guān)鍵:必須加括號 (),強制 p 先與 * 結(jié)合,確定是指針,再由 [5] 確定指向的數(shù)組類型(int [5])。
2.常見用法
指向二維數(shù)組、作為函數(shù)參數(shù)接收二維數(shù)組(避免二維數(shù)組傳參退化問題)。
- 指向二維數(shù)組并遍歷
#include <stdio.h>
int main() {
// 二維數(shù)組:3個元素,每個元素是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種等價寫法)
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
// 寫法1:p[i][j](最直觀,等價于二維數(shù)組訪問)
// 寫法2:*(p[i] + j)(p[i]是第i個一維數(shù)組的首地址)
// 寫法3:*(*(p + i) + j)(p+i指向第i個一維數(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],即第一個 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] 等價于 int p[ ][5](兩者都是數(shù)組指針的簡寫),但不能寫成 int *p[5](這是指針數(shù)組,類型不匹配)。
到此這篇關(guān)于C語言中指針數(shù)組和數(shù)組指針的具體用法的文章就介紹到這了,更多相關(guān)C語言 指針數(shù)組和數(shù)組指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

