指針遇到數(shù)組伍派,不得不說的“秘密”
-
說起數(shù)組array[i]來杠茬,我們都知道:數(shù)組名“array”是數(shù)組的唯一標識符贵扰,數(shù)組名代表數(shù)組首元素的地址菊霜。
而今天的主角——指針,則是用于存儲地址氓侧,它在C語言使用中和數(shù)組名是緊密的聯(lián)系在一起悬垃。
一、數(shù)組的訪問方式
- 一般來說采用下標/偏移法和指針法來訪問數(shù)組元素的甘苍。
- 一維數(shù)組比較常見尝蠕,而且簡單易懂。(隨便提一下:二維數(shù)組元素的表示方法是:數(shù)組名稱[行][列]载庭,對于m 行n 列的二維數(shù)組看彼,a[0][0] 是數(shù)組的第一個元素,a[m-1][n-1] 是最后一個元素囚聚。)
我們以二維數(shù)組為例--
eg:二維數(shù)組array[2][3]中靖榕,在內(nèi)存儲中存儲形式如下圖所示:
#include <stdio.h>
int main()
{
int a[2][3] = {{1,2,3},{10,20,30},{100,200,300}};
for(int i=0; i<3; i++)
{
for(int j=0; j<4; j++)
{
printf("%p ",&a[i][j]);
}
putchar(10);
}
//研究數(shù)組名a的大小
printf("a = %p\n",a);
printf("a + 0 = %p\n",a+0);
printf("a + 1 = %p\t",a+1);
printf("a + 2 = %p\n",a+2);
//研究數(shù)組a的每個元素的大小
printf("a[0] = %p\n",a[0]);
printf("a[1] = %p\t\t",a[1]);
printf("a[1] + 1 = %p\t",a[1]+1);
//研究二維數(shù)組到一維數(shù)組的關系化
printf("*(a+1)+1) = %d\t",*(a+1)+1));
printf("*(*(a+1) + 1) = %d\n",*(*(a+1)+1));
printf("&a[1] +1 = %p\n",&a[1]+1);
return 0;
}
- 從程序中我們可以總結出:
**a //表示是數(shù)組下標為0的那一行的首地址
a+1 //表示是數(shù)組下標1的那一行的首地址[<=>&a[1] ]
a[1] //<=>a[1]+0,也是a[1][0]元素的地址
a[1]+1 //指的也是a[1][1]元素的地址
(a+1)+1 //指的也是a[1][1]元素的地址
((a+1)+1) //指的是元素a[1][1]值
( a[1]+1) //指的是元素a[1][1]值
二顽铸、指針與數(shù)組參數(shù)
- 指針與數(shù)組參數(shù)分為四種情況(這里一一列舉出來茁计,就不舉例子了):
【a】實參是數(shù)組,形參也是數(shù)組
主調(diào)函數(shù):
int a[40];
function(a);
被調(diào)函數(shù):
function(int a[]) {......}
【b】實參是數(shù)組谓松,形參是數(shù)組指針
主調(diào)函數(shù):
int a[40];
function(a);
被調(diào)函數(shù):
function(int *p) {...}
【c】實參是數(shù)組指針星压,形參是數(shù)組指針
主調(diào)函數(shù):
int a[40];
int *p=a;
function(p);
被調(diào)函數(shù):
function(int *q) {......}
【d】實參是數(shù)組指針,形參是數(shù)組
主調(diào)函數(shù):
int a[40];
int *p=a;
function(p);
被調(diào)函數(shù):
function(int a[]) {......}
三鬼譬、指針與字符串
- 重點的是指針數(shù)組和數(shù)組指針
注:由于還沒有說到字符串娜膘,這里就先起個頭。望見諒优质。下章講字符串竣贪。謝謝!