當(dāng)用數(shù)組名作函數(shù)參數(shù)時(shí),如果形參數(shù)組中各元素的值發(fā)生變化,實(shí)參數(shù)組元素的值隨之變化。
如果已經(jīng)定義一個(gè)函數(shù),其原型為
void swap(int x,int y);
假設(shè)函數(shù)的作用是將兩個(gè)形參(x,y)進(jìn)行交換,現(xiàn)在有以下的函數(shù)調(diào)用:
swap (a[0],a[1]);
用數(shù)組元素做實(shí)參的情況,與用變量作實(shí)參的情況一樣,是“值傳遞”方式,將a[0]和a[1]的值單向傳遞給x和y。當(dāng)x和y的值改變時(shí)a[0]和a[1]的值并不改變。
例如:定義一個(gè)函數(shù)fun,fun函數(shù)的形參寫(xiě)成數(shù)組的形式:
void fun(int arr[],int n);
但在程序編譯時(shí)是將arr按指針變量來(lái)處理的,相當(dāng)于函數(shù)fun應(yīng)寫(xiě)成:
void fun(int *arr,int n);
void fun(int arr[], int n)
{
int s = sizeof(arr);
printf("arr所占字節(jié)數(shù)為:%d\n", s);
}
int main()
{
int brr[10];
fun(brr, 10);
return 0;
}
運(yùn)行結(jié)果:
【注意】
【例】定義一個(gè)數(shù)組名作形參的函數(shù),通過(guò)調(diào)用這個(gè)函數(shù)改變實(shí)參數(shù)組的值
int fun(int arr[], int n)
{
//int s = sizeof(arr);
//printf("arr所占字節(jié)數(shù)為:%d\n", s);
int t;
t = arr[1];
arr[1] = arr[2];
arr[2] = t;
return arr[0];
}
int main()
{
int brr[10] = { 1,3,2,4,5,6,7,8,9,10 };
fun(brr, 10);
for (int i = 0; i < 10; i++)
{
printf("%d ", brr[i]);
}
return 0;
}
運(yùn)行結(jié)果:
常用這種方法通過(guò)調(diào)用一個(gè)函數(shù)來(lái)改變實(shí)參數(shù)組的值。
(1)當(dāng)實(shí)參類型是變量名時(shí),要求形參的類型也是變量名,通過(guò)形參傳遞的信息是變量的值,通過(guò)函數(shù)調(diào)用不能改變實(shí)參變量的值。
【例】將數(shù)組a中n個(gè)整數(shù)按相反順序存放,用一個(gè)函數(shù)inv來(lái)實(shí)現(xiàn)交換。實(shí)參用數(shù)組名a,形參可用數(shù)組名,也可用指針變量。
void inv(int x[], int n)//形參x是數(shù)組名
{
int temp;
int m = (n - 1) / 2;
for (int i = 0; i <= m; i++)
{
int j = n - 1 - i;
//把x[i]和x[j]交換
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
return;
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
inv(a, 10);//調(diào)用inv函數(shù)進(jìn)行交換
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
運(yùn)行結(jié)果:
改寫(xiě)代碼,將函數(shù)inv中得形參x改成指針變量:
void inv(int *x, int n)
{
int temp;//定義一個(gè)中間變量,用來(lái)交換兩個(gè)變量得值
int m = (n - 1) / 2;
int* p;//定義一個(gè)指針變量p
p = x + m;//p指向a[m]元素的地址
int* i;//定義一個(gè)指針變量i
i = x;//i指向數(shù)組首元素的地址
int* j;//定義一個(gè)指針變量j
j = x + n - 1;//j指向數(shù)組最后一個(gè)元素的地址
for (i=x;i<=p;i++,j--)
{
//交換i和j所指向的數(shù)組元素的值
temp = *i;
*i = *j;
*j = temp;
}
return;
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
inv(a, 10);
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
運(yùn)行結(jié)果:
int fun(int x[],int n)
{
.
.
.
}
int main()
{
int a[10];
.
.
.
fun(a,10);
.
.
.
return 0;
}
void fun(int *x,int n)
{
.
.
.
}
int main()
{
int a[10];
.
.
.
fun(a,10);
.
.
.
return 0;
}
實(shí)參a為數(shù)組名,形參x為int *型的指針變量,調(diào)用函數(shù)開(kāi)始后,形參x指向a[0],即x=&a[0],通過(guò)x值的改變,可以指向a數(shù)組的任一元素,如圖所示:
void fun(int *x,int n)
{
.
.
.
}
int main()
{
int a[10];
int *p=a;
.
.
.
fun(a,10)
.
.
.
return 0;
}
實(shí)參p和形參x都是int*型指針變量。先使用實(shí)參指針變量p指向數(shù)組元素a[0],p的值是&a[0]。然后將p的值傳給形參變量x,x的初始值也是&a[0],通過(guò)x的值的改變可以使x指向數(shù)組a的任一元素,如圖所示:
void fun(int x[],int n)
{
.
.
.
}
int main()
{
int a[10];
int *p=a;
.
.
.
fun(p,10);
.
.
.
return 0;
}
void inv(int* x, int n)
{
int temp;
int m = (n - 1) / 2;
int* p;
p = x + m;
int* i;
i = x;
int* j;
j = x + n - 1;
for (i = x; i <= p; i++, j--)
{
temp = *i;
*i = *j;
*j = temp;
}
return;
}
int main()
{
int a[10];
int* p = a;//指針變量p指向a[0]
//輸入數(shù)組a的元素
for (int i = 0; i < 10; i++, p++)
{
scanf("%d", p);
}
p = a;//將指針變量p重新指向a[0]
inv(p, 10);//調(diào)用inv函數(shù),實(shí)參是變量p
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
運(yùn)行結(jié)果:
上面的main函數(shù)中的指針變量p是有確定值的。如果在main函數(shù)中不設(shè)數(shù)組,只設(shè)指針變量,就會(huì)出錯(cuò)。假如把主函數(shù)修改如下:
void inv(int* x, int n)
{
int temp;
int m = (n - 1) / 2;
int* p;
p = x + m;
int* i;
i = x;
int* j;
j = x + n - 1;
for (i = x; i <= p; i++, j--)
{
temp = *i;
*i = *j;
*j = temp;
}
return;
}
int main()
{
int a[10];
int* p;
//輸入數(shù)組a的元素
for (int i = 0; i < 10; i++)
{
scanf("%d", p+i);
}
inv(p, 10);//調(diào)用inv函數(shù),實(shí)參是變量p
for (int i = 0; i < 10; i++)
{
printf("%d ", *(p+i));
}
return 0;
}
編譯時(shí)會(huì)出錯(cuò),原因是指針變量p沒(méi)有確定值,談不上指向哪個(gè)變量:
因此,下面這樣的使用是不正確的:
void fun(int x[],int n)
{
.
.
.
}
int main()
{
int *p;
.
.
.
fun(p,10);
}
【注意】如果指針變量做實(shí)參,必須先使指針變量有確定的值,指向一個(gè)已經(jīng)定義的對(duì)象。
【例】使用指針?lè)椒▽?duì)10個(gè)整數(shù)按由大到小的順序排列。
【思路】在主函數(shù)種定義數(shù)組a存放10個(gè)整數(shù),定義int*型指針變量p指向a[0]。定義函數(shù)sort使數(shù)組a種的元素由大到小的順序排列。在主函數(shù)中調(diào)用sort函數(shù),用指針變量p作實(shí)參。sort函數(shù)的形參用數(shù)組名。用選擇法進(jìn)行排序。
//定義sort函數(shù),x是形參數(shù)組名
void sort(int x[], int n)
{
int temp;
for (int i = 0; i < n-1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (x[j]>x[i])
{
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
int main()
{
int a[10];
int* p = a;//指針變量p指向a[0]
//輸入10個(gè)整數(shù)
for (int i = 0; i < 10; i++)
{
scanf("%d", p++);
}
p = a;//指針變量p重新指向a[0]
sort(p, 10);//調(diào)用sort函數(shù)
//輸出排序后的10個(gè)數(shù)組元素
for (int i = 0; i < 10; i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
運(yùn)行結(jié)果:
如果sort函數(shù)中將x定義為指針變量,在函數(shù)中仍可以用x[i]和x[j]這樣的形式表示數(shù)組元素,它就是x+i和x+j所指的數(shù)組元素。
因篇幅問(wèn)題不能全部顯示,請(qǐng)點(diǎn)此查看更多更全內(nèi)容
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2
違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬(wàn)商天勤律師事務(wù)所王興未律師提供法律服務(wù)