c语言指着与数组,C语言指针与数组
一維數(shù)組 與? 指針
1.C語言規(guī)定:如果指針變量p已指向同一數(shù)組中的下一個元素,見下:
定義: int dates[4],? *p;
那么:dates+2=&dates[2];
*(dates+2)=dates[2];
延伸:如果:p=&dates[n];
那么:p+i 就指向 &dates[n+i];
*(p+i)就指向 dates[n+i];
p-i 就指向 &dates[n-i];
*(p-i)就指向 dates[n-i];
例子: 函數(shù)1
int array_sum(int array, int n)
{
int sum=0, *p;
int *array.end=array+n
for(p=array;p
sum+=*p;
return(sum);
}
函數(shù)2
int array_sum(int array, int n)
{
int sum=0;
int i;
for(i=0;i
sum+=array[i];
return(sum);
}
總結(jié):
C語言編譯程序通常會將其中array[i]處理為*(array+i),
每次都要增加一次加法運(yùn)算,效率就會低一些,所以使用指針訪
問數(shù)組元素的主要原因。
#include
int array_sum(int array[], int n);
void main()
{
int a[10],i;
printf("請輸入10個元素:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("輸入的元素是:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("輸入元素的和是:\n");
printf("%d",array_sum(a,10));
}
int array_sum(int array[], int n)
{
int sum=0, *p;
int *array_end=array+n;
for(p=array;p
sum+=*p;
return(sum);
}
二維數(shù)組與指針
數(shù)組都是按照行來存儲的。
例如:
int a[3][4]={{10,20,30,40},{50,60,70,80},{90,91,92,93}};
則數(shù)組a有三個元素,分別為a[0],a[1],a[2].每個數(shù)組都是一維數(shù)組,
各包含4個元素。如a[1]的4個元素分別是:a[1][0]? a[1][1] a[1][2] a[1][3]
分解圖:
數(shù) 組???????? --------------->
a??????? a[0]--------------->10?? 20??? 30??? 40
a[1]--------------->50?? ?60??? 70??? 80
a[2]--------------->90??? 91??? 92??? 93
再如:
int *p=a[0];
則數(shù)組a的元素a[1][2]對應(yīng)的指針為:? p+1*4+2
元素a[1][2] 也就可以表示為????? :????? *(p+1*4+2)
用下標(biāo)表示法,a[1][2]表示為:???????? ?p[1*4+2]
對于二維數(shù)組a,雖然a[0]、a都是數(shù)組首地址,但二者指向的對象不同。
a[0] 是一維數(shù)組的名字,它指向的是a[0]數(shù)組的首元素。
*a[0]得到的是一個數(shù)組元素的值,即a[0]數(shù)組首元素的值。所以*a[0]和a[0][0]是一個值。
a?? 是二維數(shù)組的名字,它指向所有元素的首元素。它的每一個元素?? 都是一個行數(shù)組,
因此 它的指針移動單位是“行”,所以a+i指向的是第i行的數(shù)組。即指向a[i].
*a? 得到的是一維數(shù)組a[0]的首地址,即*a與a[0]是同一個值。
備注:
當(dāng)int *p; 定義指針p時,p是一個指向int型的數(shù)據(jù),而不是一個地址,
所以 *p=a[0]是對的。
由上面可知道:
對于二維數(shù)組a,其a[0]數(shù)組由a指向,a[1]數(shù)組由a+1指向,以此類推:
a[i]的數(shù)組,由*(a+i)指向。
對于數(shù)組元素a[i][j],用
*(*(a+i)+j)? 表示,指向該元素的指針為*(a+i)+j.
數(shù)組名雖然是數(shù)組的首地址,但數(shù)組名自定義的時候就確定了,不可以通過賦值老
改變。但指向數(shù)組的指針,指針變量的值可以改變,即它可以隨時指向不同的數(shù)組
或同類型變量。
#include
int main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int *p=a[0],max,row,col,i,j;
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
if(*(p+i*4+j)> max)? //行存儲
{
max=*(p+4*i+j);
row=i;
col=j;
}
}
printf("a[%d][%d]=%d\n",row,col,max);
return 0;
}
二維數(shù)組指針:
數(shù)據(jù)類型 (*指針變量名)[二維數(shù)組列數(shù)]
對上述a數(shù)組,行數(shù)組指針定義如下:
int (*p)[4]
表示:
數(shù)組*p有4個int型元素,分別是(*p)[0] 、 (*p)[1]? 、(*p)[2]? 、(*p)[3]。
可用下列方式對指針賦值:
p=a;
賦值后p的指向:
p----------->10??? 11??? 12?? 13
p+1--------->20??? 21??? 22?? 23
p+2--------->30??? 31??? 32?? 33
修改上面的例子可以改成:
//題目:求二維數(shù)組元素的最大值,并確定最大值元素所在的行和列
//題目:求二維數(shù)組元素的最大值,并確定最大值元素所在的行和列
#include
int main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int (*p)[4],max,row,col,i,j;
p=a;
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
//if(*(p+i*4+j)> max)
if(*(*(p+i)+j)>max)?????? //修改的地方
{
//max=*(p+4*i+j);
max=*(*(p+i)+j);??? row=i;
col=j;
}
}
printf("a[%d][%d]=%d\n",row,col,max);
return 0;
}
備注: a[0]:是一維數(shù)組的名字,它指向的是a[0]數(shù)組的首元素。 a?? :是二維數(shù)組的名字,它指向所有元素的首元素。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的c语言指着与数组,C语言指针与数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 号称“智能副驾” 微软的Microsof
- 下一篇: html标题怎么分开,html – 如何