C语言参数和指针的作用的一个小技巧
有的时候我们想用一个函数去改变几个值,最后进行下一步使用。但是一个功能函数不管处理
多少个数据,它只能返回一个结果。在我们需要获取改变的多个结果时,就可以通过传指针
来达到目的。
跨变量作用域操作数据,请对比以下两个函数
#include <stdio.h>
void swap1(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
printf("值a:%d b:%d\n",a,b);
printf("地址:a=%p b=%p\n",&a,&b);//&a为提取变量a的地址
}
void swap2(int *a,int *b);
int main(void)
{
int a, b;//初始化两个变量
a=3;
b=5;
printf("数据操作前:a=%d b=%d\n",a,b);
swap1(a,b);//这里传过去的是值 传参的本质我认为是赋值 ,被调用函数复制了一份两参数的值
//但是复制的那一份的地址与主函数的实参地址不一样。
printf("swap1作用以后:a=%d b=%d\n",a,b);
printf("a的地址:%p b的地址:%p\n",&a,&b);
swap2(&a,&b);//这里传过去地址,虽然地址被复印了一份,但是地址一样。本质上它操作内存同一位置
printf("swap2作用以后:a=%d b=%d\n",a,b);
return 0;
}
void swap2(int *a,int *b)//注意* 号只有在声明的时候才代表指针,在除算数运算外位取地址的内容
{
int temp;
temp=*a; //所以此处*a==指针变量a地址中存的值 即a的值3;
*a=*b;
*b=temp;
}
还有一个摘自谭浩强书的一个基础知识测试
1.定义整型变量 p
2.定义指向整型数据的指针变量 p
3.定义整型数组p,它有5个整型元素
4.定义指针数组p,它由4个指向整型数据的指针元素构成
5.定义p为指向包含4个整型数据元素的一维数组的指针变量
6.p为返回整型数据的函数
7.p为返回指向整型数据指针的函数
8.p为指向函数的指针,该函数返回整型数据
9.p是一个指向 指向整数数据指针的指针变量
10.p是一个指针变量,基本类型为void类型,不指向具体对象
答案:
1.int p; 普通变量
2.int *p; 指针变量
3.int p[5]; 普通变量集合
4.int * p[4]; 指针变量集合 指针数组
5.int (*p)[4]; 数组指针 即数组的地址
6.int p(); 普通函数 返回变量
7.int * p(); 普通函数 返回指针
8.int (*p)(); 函数指针 函数的地址
9.int * * p; 指向指针的指针 二级指针
10.void * p; 无类型指针(可以强转成其他类型)如(int *)p;
再来一个C语言操作内存的直观程序
#include <stdio.h>
int main(void)
{
int a=10;
int b=50;
int *pa=&a;//我在Linux——vi下编辑,所以给了这么大的地址
int *c=(int*)0x7fff364ad508;
printf("&a:%p\n&b:%p\npa:%p\n",&a,&b,pa);
printf("c:%p\n",c);
printf("a:%d\n*pa=%d\nb:%d\n",a,*pa,b);
return 0;
}
函数返回数组
其实是返回指向数组首地址的指针,可以试试返回数组的指针
#include <stdio.h>
void arrPRIN(int *arr)
{
int i=7;
while(i--)
{
printf("%16p %d\n",arr,*arr);
arr++;
}
}
int* creatARR()
{
static int arry[7];//importante static
int i;
for(i=0;i<7;i++)
{
printf("input:");
scanf("%d",&arry[i]);
}
arrPRIN(arry);
return arry;
}
int main(void)
{
int *p=NULL;
p=creatARR();
arrPRIN(p);
return 0;
}
函数指针数组
模拟单片机小车驱动程序
#include <stdio.h>
void advance(void)
{
printf("小车前进\n");
}
void retreat(void)
{
printf("小车后退\n");
}
void left(void)
{
printf("小车左转\n");
}
void right(void)
{
printf("小车右转\n");
}
void stop(void)
{
printf("小车停止\n");
}
int main(void)
{
void (*array[5])(void)={advance,retreat,left,right,stop};
char cmd;
while(1)
{
cmd='a';
printf("输入控制指令:");
scanf("%c",&cmd);
getchar();
switch(cmd)
{
case 'q':
(*array[0])();
break;
case 'h':
(*array[1])();
break;
case 'z':
(*array[2])();
break;
case 'y':
(*array[3])();
break;
default:
(*array[4])();
}
}
return 0;
}