數組指針
int (*p)
;
首先P是一個指針,指向一個整型一維數組,這個數組的長度是n,也就是P的步長,
如果P++,那麼P就跳過n長度到下一個數組,
如果用指針定義一個二維數組
int a[3][4];
int (*p)[4]//定義一個數組指針,該指針指向一個有4個元素的一維數組
p = a//將二維數組中首個一維數組的地址給指針,就是a[0]或者&a[0][0]
p++//指針P指向的下一個一維數組就是a[1][ ];
所以數組指針是指向一維數組的指針,也就是行指針
輸入二維數組的方法可以是:
for(i = 0 ; i < MAX_SIZE;i++)
//scanf("%s",*p + i)
//scanf("%s",&(*p)[i])
數組指針的使用條件是:函數傳參的時候
一維數組名傳參:用的是元素的指針
void print_ptr(char *ptr)/void print_ptr(char ptr[100])
二維數組名傳參:用的是一維數組的指針
void print_prt(char (*ptr)[100])/void print_prt(char **ptr)
三位數組名傳參:用的是二維數組的指針
void print_ptr(char (*ptr)[3][100])/void print_ptr(char ***ptr)
//對一維數組的數組名取地址= 數組的地址
//對一維數組的地址取值= 數組元素的首地址
指針數組
int *p
:該數組中有n個指針類型的元素。
如要將二維數組賦給一指針數組:
int *p[3];
int a[3][4];
p++; //該語句表示p數組指向下一個數組元素。注:此數組每一個元素都是一個指針
for(i=0;i<3;i++)
{
初始化:因為定義一個指針數組,數組中的指針都是野指針,所
以要進行內存空間的分配
p[i] = (int *)malloc(sizeof(int));
p[i]=a[i];
}
這裡int *p[3] 表示一個一維數組內存放著三個指針變量,分別是p[0]、p[1]、p[2]
所以要分別賦值。
例如:
用指針數組遍歷字符串
char *ptr[3] = {"hello1","hello2","hello3"};
for(i = 0;i < 3;i++)
{
printf("ptr[%d] = %s\n",i,ptr[i]);
}
函數傳參
void print_ptr(char **ptr)//因為數組裡存放的是指針,所以形參必須用指針的針
來接參,傳過來的實參是:指針變量或者是指針數組。
{
int i;
for(i = 0; i < 3;i++)
{
//printf("%s\n",ptr[i]);
// printf("%s\n",*(ptr + i));
}
}
_
數組指針只是一個指針變量,C語言裡一般專門用來指向二維數組的,它占有內存中一
個指針的存儲空間。
指針數組是多個指針變量,以數組形式存在內存當中,占有多個
指針的存儲空間。