函数传参
传参有值传递和地址传递(指针传递)
值传递
值传递的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向的传送给实参
在函数调用过程中,形参值的变化不会影响到实参值的变化
#include <stdio.h>
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
temp = x;
peintf("x:%d y:%d", x, y);
}
int main(void)
{
int a, b;
printf("please input tow number;");
scanf("%d %d", &a, &b);
if(a< b)
{
swpa(a,b);
}
printf("a:%d b:%d", a, b);
return 0;
}
例程中 调用swap()交换函数后函数值仅在swap()中交换,而脱离swap()后函数值不受影响
地址传递(指针传递)
在函数调用过程中形参指针本身值得的变化不会影响到实参指针本身值的变化,这个和值传递是相同的
通过形参指针可以修改实参指针所指向的存储单元中的值。
#include <stdio.h>
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2= temp;
}
int main(void)
{
int a, b, *pa, *pb ;
printf("please input tow number;");
scanf("%d %d", &a, &b);
pa = &a;
pb = &b;
if(a < b)
{
swap(pa,pb);
}
printf("a:%d b:%d\n", a, b);
return 0;
}
例程中 ,swap函数采用地址传递方式 ,在主函数中将a和b的地址赋值给指针 在swap函数中将指针输入,swap通过指针直接改变了a和b的值。
数组的遍历方式
数组的遍历方式有下表法和指针法
下表法
引用数组元素可以用下表找到对镜的元素并对其进行操作
#include <stdio.h>
int main(void)
{
int a[] = {1.2.3.4.5};
int i;
for(i = 0;i < 5; i++)
{
printf("%d", a[i]);
}
return 0;
}
指针法
将数组名(即数组的首地址)赋值一个指针,该指针就是指向数组的指针
例如
int a[5] = {1,2,3,4,5};
int *p = a; //p为指向数组的指针(p指向数组中的第一个元素)
通过指向数组的指针可以操作数组中的元素
如
printf("a[1]%d\n",*(p+1)); //输出数组中的第二个元素值
*(p+2) = 30; //将数组中的第三个元素值修改30
遍历
int a[5] = {1,2,3,4,5};
int i;
for(i = 0; i < 5; i++)
{
printf("%d",*(a+i));
}
/*******************************/
int a[5] = {1,2,3,4,5};
int *p = a;
for(i = 0; i < 5; i++)
{
printf("%d",*(p+i));
}
/********************************/
int a[5] = {1,2,3,4,5};
int *p = a;
for(; P < (a + 5); P++)
{
printf("%d",*p);
}
数组的传参方式
指针和数组代表的都是一个地址 所以大体相同,结合上文数组遍历理解
值得注意的是数组在函数外的大小是数组的大小
而在函数内的大小是指针的大小,因为在函数内时是指针依次指向数组中存储的值故在函数内的大小是指针的大小
void print_array1(int array[], int size)
{
int *P;
for(p = array; p< array + size ;p++)
printf("%d",*p)
}
void print_array2(int *ap, int size)
{
int *P;
for(p = ap; p< ap + size ;p++)
printf("%d",*p)
}
二级指针
二级指针即使指向指针的指针
二级指针执行那个另外一个指针变量
二级指针的指针运算符为**
二级指针中存放的是一级指针的地址
int = a;
int *p = &a; //取变量a的地址给指针p
int **pp = &p; //取指针p的地址给二级指针pp
**PP = *P = a; //**pp可以理解为先取指针p的内容,即取到了a的地址,在取a地址对应的值,即a存储的值
上面中p存放的是a的地址,pp存放的是p的地址