指针的进阶
一维数组传参
结论
1:C语言中,当一维数组做函数参数时,编译器总是把它解析成一个指向其首元素的指针。
2:实际传递的数组大小与函数形参指定的数组大小没有关系。
正确写法1:
void test(int arr[])
解释说明:编译器把array解析成指向整形元素的指针,也就是数组的首地址,方括号中加不加指定数字都可以,因为编译器根本不看,因此最好不写,以免引起误解。
正确写法2:
void test(int *arr)
解释说明:这样写就更直接明了了,参数是指向整形元素的指针,而数组的名字又是首元素的地址,也印证了数组名是指针常量。
二维数组传参
一个二维数组可以不知道有多少行,但是必须知道有多少列,这样方便运算,所以设计函数时只能省略第一个[ ]中的数字。
正确写法:
void test1(int arr1[][5])
void test2(int arr2[3][5])
一级指针传参
#include<stdio.h>
void printf(int *p,int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d\n",*(p+i);
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9};
int *p=arr;
int sz=sizeof(arr)/sizeof(arr[0]);
printf(p,sz);
return 0;
}
函数指针
指向函数的指针,存放的是函数的地址
&函数名和函数名打印的都是函数的地址
例:
void Add(int x,int y)
{
return x+y;
}
int main()
{
int sum=0;
int (*p)(int,int)=Add;
sum=p(3,4);
printf("%d\n",sum);
return 0;
}
函数指针数组
存放函数指针的数组,类型为函数指针;
例,上面函数可以改成如下:
int (*p2[4])(int ,int);//函数指针数组
int (*(*p2)[4])(int,int);//指向函数指针数组的指针
函数指针数组
指向函数指针数组的指针
函数指针数组的实现
#include<stdio.h>
void add(int a,int b)
{
return a+b;
}
void sub(int a,int b)
{
return a-b;
}
void mul(int a,int b)
{
return a*b;
}
void div(int a,int b)
{
return a/b;
}
int main()
{
int x,y=0;
int input=0;
int ret=0;
int (*parr[5])(int x,int y)={0,add,sub,mul,div};
while(input)
{
printf("****************************\n");
printf("*****1.add 2.sub*****\n");
printf("*****3.mul 4.div*****\n");
printf("****************************\n");
scanf("%d\n",&input);
if(input<=4&&input>=1)
{
printf(“请输入:”);
scanf("%d %d",&x,&y);
ret=(*p[input])(x,y);
}
else
printf("输入有误,请重新输入“);
printf("%d",ret);
}
return 0;
}
笔试题
#include <stdio.h>
int main(int argc, char * argv[])
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p; p = a[0];
printf( "%d", p[0]);
return 0;
}
逗号表达式从左往右依次计算,整个表达式的结果是最后一个表达式的值
所以这个二维数组的结果为:{1,3,5,0,0,0}
指针p指向该二维数组首地址a[0],也就是a[0][0], *p=&a[0][0],所以p[0]就是a[0],结果为1.