C语言中关于数组作为函数形参中指针的用法

一维数组示例

见如下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void add(char *p, int len){
	int i=0;
	printf("%c\n", p[len-1]);
	printf(“%d\n”, p[len-1]);   //由这两行可以看出main函数中的gets()函数在输入字符串的时候会以\0(空字符)结尾
	for(i=0; i<len-1; i++){     //所以在这里i可以设置为i<len-1, 因为数组下标是len-1的那个字符就是上面所讲的空字符
		printf("%c", p[i]);
	}
}
int main(){
	char name[10];
	gets(name);
	int len;
	len=strlen(name);
	printf("主函数:%s\n", name);
	add(&name[0], len); 
    //由于上面所定义的add(char *p, int l)函数中p为指针,所以在这里要传入数组的地址,而数组的地址只需传入数组的首地址即可,后面可通过add函数中for循环的p[i]来依次输出。(在C语言中用&来取变量地址)
    //注意:由于字符串长度有严格限制,所以在这里还需要传入一个int类型的变量len,以便于后续输出;
	return 0;
}

二维数组示例

二维数组地址的理解

见如下代码:

#include<stdio.h>
#include<stdlib.h>

int main(){
	int i, j;
	int chs[2][3]={'I', 'l', 'o', 'v', 'e', 'U'};
	for(i=0; i<2; i++){
		for(j=0; j<3; j++){
			printf("%c ", chs[i][j]);
		}
	}
	printf("\n");
	for(i=0; i<2; i++){
		for(j=0; j<3; j++){
			printf("%p\n", &chs[i][j]); //在这里,我们输出数组中所有元素的地址
		}
	}
	return 0;
}

输出结果如下:
在这里插入图片描述

二维数组示例测试

由此我们可以发现二维数组其实就是一维数组的一个简单的变形,所以我们可以用同样的方法来把数组的首地址当作指针,以此来作为函数形参,见如下代码:

#include<stdio.h>
#include<stdlib.h>

int main(){
	int i, j;
	char add(char *p);
	char chs[2][3]={'I', 'l', 'o', 'v', 'e', 'U'};
	add(&chs[0][0]);//这里与一维数组不同,需要输入具体的首地址,而将&chs[0][0]替换为&chs,是无法编译的
	return 0;
}

char add(char *p){
	printf("%c", p[5]);//在这里我们指定输出的是“U”
	return 0;
}

输出结果如下:
在这里插入图片描述
总结:在最后总结一下以上的内容,二维数组只是一维数组的一个变形,本质是一样的,但在使用的时候会稍微有些不同。比如二维数组作为形参时,要求我们写的更加具体,输入首地址后接下来便和一维数组一样操作。

用法

通过指针我们可以访问内存地址,通过对内存的修改来对数组进行改变,这样就可以解决函数无法返回一个数组的问题,见如下代码:

#include<stdio.h>
#include<stdlib.h>

int main(){
	int i, j;
	char add(char *p);
	char chs[2][3]={'I', 'l', 'o', 'v', 'e', 'U'};
	add(&chs[0][0]);
	for(i=0; i<2; i++){
		for(j=0; j<3; j++){
			printf("%c ", chs[i][j]);
		}
	}
	return 0;
}

char add(char *p){
	char i;
	i=p[5];
	p[5]=p[0];
	p[0]=i;
	return 0;
}

输出结果如下:
在这里插入图片描述
本人初次写博客,觉得将注释写在代码内有助于理解,如有不足的地方,请多多指教。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页