扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
数组名就是指针,例如:
梅江ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
#include stdio.h
void pr(char *p)
{
printf(p);
}
void main(void)
{
char s[] = "abc";
pr(s);
}
扩展资料:
注意事项
非数组类的声明尽量以指针的方式进行比较好。倘若一个指针指向的内存并不是一个数组,那么采用数组名的声明方式或许就会给人产生错误的引导。类似的,如果指向的是一个数组区域,则会给人以更加丰富的信息。例如:
int main(int argc,char* argv[])
{
/* code here */
}
与
int main(int argc,char** argv)
{
/* code here */
}
两种方式完全等价,但是前面一种能够更清晰地看出:这个参数是指向某个元素起始地址的指针,而后面的这种方式则不能够直观地看出这种含义。
这是个函数指针 前面的void为返回值类型 后面的void*为参数类型.
函数指针是可以作为某个函数的参数的.
(1) 指向函数的指针变量的一般定义形式为:
数据类型 (*指针变量名)(函数参数列表)
函数名是可以缺省的 作为参数传递的时候会去调和 void*(*)(void*)这个类型相匹配的函数的
作为参数调用这个函数的时候 返回类型是void* 就相当于传了一个参数类型为void*,当然这个函数指针的参数也是void*的
C语言中
指针做函数参数传递二维数组有两种基本方法:
1、传递“数组指针”
#include stdio.h
void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组
{
int i,j;
for( i=0;in;i++ ){
for( j=0;j3;j++ )
printf("%d ", pa[i][j] );
printf("\n");
}
}
void main()
{
int a[2][3]={
{1,2,3},
{4,5,6}
};
output(a,2);
}
2、传递“指针数组”
先将二维数组的行指针存储到一个指针数组中,再将指针数组传递到子函数中去。
#include stdio.h
void output( int *pa[], int row,int col ) //这个函数更通用,但调用前,要做好准备工作。
{
int i,j;
for( i=0;irow;i++ ){
for( j=0;jcol;j++ )
printf("%d ", pa[i][j] );
printf("\n");
}
}
void main()
{
int a[2][3]={
{1,2,3},
{4,5,6}
};
int i;
int *pa[2];
for( i=0;i2;i++ )
pa[i]=a[i];
output(pa, 2, 3);
}
因为数组的每一个元素在内存中是连续存放的,只要传递数据的首地址,你就可以根据对指针的"++"或--"操作,或直接在首地址上加上某个数,来得到数据其他的元素地址,然后用"*"操作符可以访问对应地址存放的数值。
比如,有如下这样语句:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 定义数组a
int *p = a; // 使指针p指向数据的首地址,类似给函数传递首地址
1、使用"++"操作符,p目前指向的是数组首地址,那么p++之后,p就应该指向存放数组第二个元素的地址,这样就可以用*p得到第二个元素的值(2)。依此类推。
2、可以直接对首地址加某一个数,比如p+4,因为p指向数组首地址,所以p+4就是指向存放数据第五个元素的地址。这样就可以用*(p+4)得到第五个元素的值(5)。其实这里的*(p+4)与p[4]效果是一样的,只是写法上的不同而已,但是p[4]更直观一些,所以大部分编程人员都愿意用p[4]这种形式,因为它看其来像个数组,更好理解一些。
总而言之,用数组首地址可以访问数组的所有元素,就是因为可以通过对首地址的相加减来得到其他元素的地址,从而可以得到数组的每一个元素值。
这样说,你明白了吧。
如果还不太明白,那就看看谭浩强的《C语言程序设计》的“数组与指针”篇,那里写的很详细的(P210)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流