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

char *fun(char (* a) [81], int num, char * max)//二维数组,接受首地址,char *定义一个字符串指针接受ps的地址。
//char* fun():声明一个函数返回值为一个指向字符(串)的指针。
{
	int i=0;
	max=a[0];//接收a[0]字符串的首地址
	for(i=0;i<num;i++)
	{
        if(strlen(max)<strlen(a[i]))// strlen()中的参数是地址,是数组名,也是数组的首地址.
                                    //a[i]必定是一个二位数组,求这个二维数组第二维的大小
	    max=a[i];
    }
	return max;//返回的是一个地址。
}

void main()
{
  FILE *wf;
  char ss[10][81],*ps=NULL;//定义一个二维数组,和字符型指针

  char s[3][81]={"abcd","deg","diegns"},*p=NULL;

  int  i=0,n;
  system("CLS");//一个实现清屏的操作
  printf("输入若干个字符串:");

  gets(ss[i]);//利用gets函数输入一个字符串
  puts(ss[i]);//利用puts函数输出一个字符串

  while(!strcmp(ss[i], "****")==0)  /*用4个星号作为结束输入的标志*/
     {
      i++;
      gets(ss[i]);
      puts(ss[i]);
     }
  n=i;

  ps=fun(ss,n,ps);//调用函数传递三个参数,ss是二位数组的首地址,n是i输入了几个参数,ps是一个指向字符串的指针

  printf("\nmax=%s\n",ps);
/******************************/
  wf=fopen("out.dat","w");
  p=fun(s,3,p);
  fprintf(wf,"%s",p);
  fclose(wf);
/*****************************/
}

c语言 strlen()中的参数是地址还是什么?

是数组名,也是数组的首地址.

char*是什么数据类型?

char*是字符指针数据类型,它的本质是个指针,也就是地址,它指向了一个char类型(字符类型)的内存单元。

指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。指针作为数据类型,可以从一个函数类型、一个对象类型或者一个不完备类型中导出。从中导出的数据类型称之为被引用类型(referenced type)。指针类型描述了一种对象,其值为对被引用类型的实体的引用。

C++ 怎么把字符数组当作函数参数传递?

以指针方式 或 数组方式都可以实现参数传递,实际上都是将数组的首地址传递到子函数中去。

字符一维数组数组名是首地址吗?

凡是数组都是首地址,其实所有变量名都是个地址。

二维字符数组的定义,初始化及引用,C语言二位字符数组详解

二维字符数组的定义格式为:

char 数组名[第一维大小][第二维大小];

如:

char c[3][10]; //定义了一个3行10列的二维字符数组c

由于该二维数组的每一行 c[0]、c[1]、c[2] 均是含有 10 个元素的一维字符数组,即二维数组的每一行均可表示一个字符串。

二维字符数组的初始化

通常情况下,二维数组的每一行分别使用一个字符串进行初始化。 例如:

 
char c[3][8]={{"apple"},{"orange"},{"banana"}};
等价于:

char c[3][8]={"apple","orange","banana"};

以上两条初始化语句中,二维数组的第一维大小均可省略。数组 c 的逻辑结构如下所示:
 

01234567
c[0]apple\0\0\0
c[1]orange\0\0
c[2]banana\0\0

二维字符教组的引用

可以使用行下标和列下标引用二维字符数组中的每个元素(字符),例如:

char c[][10]={"apple","orange","banana"};


以下均是对二维字符数组元素的合法引用:

printf ("%c",c[1][4]); //输出1行4列元素'g'字符
scanf ("%c",&c[2][3]); //输入一个字符到2行3列元素中
c[2][0]='B'; //把字符赋值给2行0列元素
printf ("%s",c[1]); //c[1]为第2行的数组名(首元素地址),输出 orange
scanf ("%s",c[2]); //输入字符串到c[2]行,从c[2]行的首地址开始存放


以下是对二维字符数组元素的非法引用:

c[0][0]="A"; //行、列下标表示的为字符型元素,不能使用字符串赋值
printf ("%c",c[2]); //c[2]为第3行的首地址,不是字符元素,故不能用%c


【例 1】 分析以下程序,输出其运行结果。

#include<stdio.h>
int main (void)
{
char c[3][5] = {"Apple","Orange","Pear"};
int i;
for(i=0;i<3;i++)
printf ("%s\n",c[i]);
return 0;
}

分析:本题主要考查二维数组的逻辑结构和存储结构的区别。二维数组在逻辑上是分行分列的,但其存储结构却是连续的。


字符串 "Apple" 的长度为 5,加上结束符 "\0" 共 6 个字符,前 5 个字符分别从 c[0] 行的首元素 c[0][0] 开始存放,到 c[0][4],第 6 个字符 '\0' 只能保存到 c[1] 行的首元素 c[1][0]。

字符串 "Orange" 的长度为 6,该字符串的前 5 个字符分别从 c[1] 行的首元素 c[1][0] 开始存放,到 c[1][4],第 6 个字符及结束符 '\0' 顺序存到 c[2][0] 和 c[2][1]。

字符串 "Pear" 的长度为 4,该字符串的 5 个字符(包含 '\0')分别从 c[2] 行的首元素 c[2][0] 开始存放,到 c[2][4]。


故该数组各元素中的值如下所示。

01234
c[0]Apple
c[1]Orang
c[2]Pear\0


由上述可以发现,该二维字符数组空间仅有一个字符串结束符 '\0',而 printf("%s",地址); 的功能是输出一个字符串,该串是从输出列表中的地址开始,到第一次遇到为止之间的字符组成的串。
 

c[0] 为 c[0] 行的首地址,即 &c[0][0]。

printf ("%s\n",c[0]); //输出AppleOrangPear
printf ("%s\n",c[1]); //输出OrangPear
printf ("%s\n",c[2]); // Pear

运行结果为:

AppleOrangPear
OrangPear
Pear

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐