c语言函数怎么调用数组部分
一、数组可定义为全局变量,函数直接调用。
二、数组可定义为局部变量,再通过参数传递到函数中调用(实参传数组名,表示数组首地址,也可通过指针或数组名+数字来传递数组局部地址)。
三、main函数想要调用函数返回的数组,可用static定义静态变量或malloc定义动态数组(字符串常量也可返回使用,但局部变量,在函数调用结束会被释放,不能作为返回地址使用)。
下面是演示代码:
#include stdio.h
#include string.h
#include malloc.h
char str1[]=”我是全局变量数组”;
char *fun0(char str2[]);
char *fun1();
char *fun2();
int main()
{
char *str3=NULL,*str4=NULL,*str5=NULL;
char str2[]=”我是main函数的局部数组变量”;
str3=fun0(str2);
printf(“str3:%s,fun函数调用结束,我的地址依然可以使用\n”,str3);
str4=fun1();
printf(“str4:%s,fun函数调用结束,我的地址依然可以使用\n”,str4);
str5=fun2();
printf(“str5:%s,fun函数调用结束,函数结束不会自动释放\n”,str5);
free(str5);
return 0;
}
char *fun0(char s[])
{
static char str3[]=”我是fun函数申明的静态数组变量”;
printf(“str1:%s,fun函数可以直接调用\n”,str1);
printf(“str2:%s,fun函数通过参数将我的地址传进来\n”,s);
return str3;
}
char *fun1()
{
char *str4=”我是fun1函数的字符串常量”;
return str4;
}
char *fun2()
{
int len;
char sTemp[]=”这是一个临时数组,之后用于给mallc申请的地址传值,传递内容为:(我是fun函数通过mallic申请的数组)”;
char *str5=NULL;
len=strlen(sTemp+63);
str5=(char *)malloc(sizeof(char)*len+1);
if(!str5)return NULL;
strcpy(str5,sTemp+63);
str5[len-2]=0;
return str5;
}
c语言字符数组使用方法
c语言字符数组使用方法
导语:字符数组是一个存储字符的数组,而字符串是一个用双括号括起来的以’/0’结束的字符序列,下面就由我为大家介绍一下c语言字符数组使用方法,希望对大家有所帮助!
1、字符数组的定义与初始化
字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。
char str[10]={ ‘I’,’ ‘,’a’,’m’,’ ‘,‘h’,’a’,’p’,’p’,’y’};
即把10个字符分别赋给str[0]到str[9]10个元素
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 ‘/0’ )。
2、字符数组与字符串
在c语言中,将字符串作为字符数组来处理。(c++中不是)
在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,例如,定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符’/0’代表。如果有一个字符串,其中第10个字符为’/0’,则此字符串的有效字符为9个。也就是说,在遇到第一个字符’/0’时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个’/0’作为结束符。例如”C Program”共有9个字符,但在内存中占10个字节,最后一个字节’/0’是系统自动加上的。(通过sizeof()()函数可验证)
有了结束标志’/0’后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测’/0’的位置来判定字符串是否结束,而不是根据数组的`长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ])
说明:”代表ASCII码为0的字符,从ASCII码表中可以查到ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
对C语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法――即可以用字符串常量来初始化字符数组:
char str[ ]={“I am happy”}; 可以省略花括号,如下所示
char str[ ]=”I am happy”;
注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的
char str[ ];
str=”I am happy”;
不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘’括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量”I am happy”的最后由系统自动加上一个’/0′)
因此,上面的初始化与下面的初始化等价
char str[ ]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’/0′};
而不与下面的等价
char str[ ]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};
前者的长度是11,后者的长度是10.
说明:字符数组并不要求它的最后一个字符为’/0’,甚至可以不包含’/0’,向下面这样写是完全合法的。
char str[5]={‘C’,’h’,’i’,’n’,’a’};
++++++++
可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。
#include
void main(void)
{
char c1[]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};
char c2[]=”I am happy”;
int i1=sizeof(c1);
int i2=sizeof(c2);
printf(“%d”,i1);
printf(“%d”,i2);
}
结果:10 11
3、字符串的表示形式
在C语言中,可以用两种方法表示和存放字符串:
(1)用字符数组存放一个字符串
char str[ ]=”I love China”;
(2)用字符指针指向一个字符串
char* str=”I love China”;
对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量”I love China”直接赋给该字符串变量,这是不对的。
C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。
两种表示方式的字符串输出都用
printf(“%s”,str);
%s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str自动加1,使之指向下一个字符…,如此,直到遇到字符串结束标识符 ” /0 “。
4、对使用字符指针变量和字符数组两种方法表示字符串的讨论
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。
4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
4.2、赋值方式:
对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];
str=”I love China”; (但在字符数组初始化时可以,即char str[14]=”I love China”;)
而对字符指针变量,采用下面方法赋值:
char* a;
a=”I love China”;
或者是 char* a=”I love China”; 都可以
4.3、对字符指针变量赋初值(初始化):
char* a=”I love China”;
等价于:
char* a;
a=”I love China”;
而对于字符数组的初始化
char str[14]=”I love China”;
不能等价于:
char str[14];
str=”I love China”; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
5、字符串处理函数
5.1
char *strcat(char *str1,const char *2 );
char *strcat(char *strDestination,const char *strSource );
功能:函数将字符串str2 连接到str1的末端,并返回指针str1
注:连接前两个字符串的后面都有一个’ /0 ‘,连接时将字符串1后面的 ‘ /0 ‘去掉,只在新串最后保留一个 ‘ /0 ‘
5.2
char *strcpy(char *str1,const char *2 );
char *strcpy(char *strDestination,const char *strSource );
功能:复制字符串strSource中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。
注:1、“字符数组1”必须写成数组名形式,“字符串2″可以是字符数组名,也可以是一个字符串常量
2、复制时连同字符串后面的 ‘ /0 ‘ 一起复制到数组1中
3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy函数处理。
4、可以用strcpy函数将字符串2中的前若干个字符复制到字符数组1中去。
;
c语言怎样手动输入数组?
C语言中,如何手动输入二维数组?c语言的数组是非常重要的内容,特别是二维数组的内容,所以今天就由小编来为大家介绍c语言怎么创建一个二维数组。
工具原料c语言电脑
方法/步骤分步阅读
1
/6
第一首先在电脑上打开c语言编程软件。
然后创建项目。
2
/6
第二然后导入stdio.h和stdlib包。
再加入malloc包。
3
/6
第三然后定义五个参数。
再创建其中两个参数的空间。
4
/6
第四然后用for语句进行循环。
再用scanf语句进行接收输入到二维数组。。
5
/6
第五然后用两个for语言循环。
再输出二维数组的数值。
6
/6
第六然后用printf语句进行数据输出分格。
这样一个二维数组就创建成功了。
注意事项
个人经验,仅供参考。
内容仅供参考并受版权保护
扩展内容:
二维数组:
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。
二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t,按“列优先顺序”存储时,地址计算为:LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t,存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节。
C语言如何输入一个数组
1、输入数组需要使用指针获取地址后,就能对得到的数组就行操作了。首先打开DEV C++软件,新建一个空白的C语言文件:
2、输入程序的源码,先定义一个整型数组“a[5]”,采用scanf语句输入数组中的每个元素,这里使用指针来对输入的数字进行访问,要先给输入的每一个数字给予它的地址,便于访问,最后拿得到的数计算出平均值输出,程序就编写完成了:
3、代码全部编写成功之后编译运行,在弹出的输入面板中输入任意5个整数,按回车键,即可得出平均值,以上就是用C语言输入一个数组,关键点是数组的获取要用指针:
c语言中怎么把一个数组清空
1. 在C语言中如何把数组清空
有两种方法可以实现。
为方便说明,定义整型数组a,并实现将a清空。
int a[4] = {1,2,3,4};
1、通过数组遍历,逐个赋值为0。
定义循环变量int i;
for(i = 0; i 4; i ++)
a[i]=0;
该程序功能为遍历数组a,逐个将元素赋值为0,实现清空效果。
2、借助内存赋值函数memset,整体赋值为0。
void *memset(void *dst, int value, size_t size);
这个函数的功能为将src上,大小为size字节的数据赋值为value。需要注意的是,该函数赋值是以字节为单位的。
调用该函数时需要引用头文件string.h,即
#include string.h
清空数组的代码为
memset(a,0,sizeof(a));
2. C语言如何从数组中删除一个指定元素
del函数的作用是删除数组a中的指定元素x,n为数组a的元素个数。函数的返回值,为删除元素后的有效元素个数(数组中可能有重复元素)。
函数的原型为:
int del (int a[10],int n,int x)
(1)请实现这个函数,并完成测试。
[参考解答]
[cpp] view plain copy
#include
int del(int a[],int n, int x);
int main( )
{
int a[20]= {86,76,62,58,77,85,92,80,96,88,77,67,80,68,78,87,64,59,61,76};
int i, n;
n = del(a, 20, 77);
printf(”剩余 %d 个:\n”, n);
for(i=0; iprintf(“%d “, a[i]);
printf(“\n”);
return 0;
}
int del(int a[],int n, int x) 删除长度为n的a数组中值为x的元素
{
int p=0, q=0; 用p和q两个变量
while (q{
if(a[q]!=x) 只有当元素值不等于x才往p标识的位置上“搬”
{
a[p]=a[q];
p++;
}
q++;
} 最后的效果,等于x的元素都没有“搬”过来,它们被“覆盖”了,也即被删除了
return p; p代表的,就是删除后的元素个数
}
(2)如果在函数调用时,要求数组中的元素呈升序排列呢?[参考解答]
思路:例如在下面main函数中的测试,删除77时,分三个阶段:①先找到77;②跨过若干个77后,找到了80;③从80开始,将数据逐个地搬到前面合适的位置(“覆盖”了77及随后的位置)。
[cpp] view plain copy
#include
int del(int a[],int n, int x);
int main( )
{
int a[20]= {58, 59, 61, 62, 64, 67, 68, 76, 77, 77, 77, 80, 80, 85, 86, 87, 88, 88, 92, 96};
int i, n;
n = del(a, 20, 77);
printf(”剩余 %d 个:\n”, n);
for(i=0; iprintf(“%d “, a[i]);
printf(“\n”);
return 0;
}
int del(int a[],int n, int x) 删除长度为n的a数组中值为x的元素
{
int p=0, q;
while (a[p]p++;
q=p; 阶段②:p将标记住这个待删除的位置
while(a[q]==x qq++;
while(qa[p++]=a[q++]; 阶段③:将要保留的元素,直接“覆盖”到p标记住的位置,逐个赋值,结果就是将等于x的元素删除了
return p; p代表的,就是删除后的元素个数
}
3. C语言中怎么删除数组中的一个元素
方法: 删除就是将其下标所在位置的中的内容置为空(也就是0),然后从此位置开始,后面的内容前移,再把最后那个位置的置为空(就是0)。
前移无非就是 类似 arr[ i – 1] = arr[ i ] 这个意思。 当可以确认数组中存放的都是整数,你可以将这个元素置为-1表示删除。
增加就是先检查你的数组中有没有-1的元素,如果有,就设置为你的值。如果全部都满了,就开一个更大的数组,把数据拷贝过去。
把相应位后面的一次前移一位,就是实现了删除操作,可以用个for循环就可以实现了。 数组的内存分配:变量在内存中是从大到小寻址的(内存中以字节为单位),比如00000000 00000000 00000000 00001010在内存中,00001010的地址是最小的;而数组则有些不同,数组的元素自然的从上往下排列 存储,整个数组的地址为首元素的地址。
(但是组成元素的字节还是按从大到小)。 。
4. C语言数组清空的几种方法比较
任何类型的数组都可以,实际上memset函数是对某一个地址以及该地址之后的一串空间进行赋值操作,只要是地址值,都可以被赋值。
1、memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第二个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。
2、函数介绍:void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
5. c语言:如何在一个排序好的数组中删除一个数
办法不至一个,比较直观的是找到要删除的元素后,将它后面的元素依次向前移动(拷贝)一位。举例代码如下:
#include “stdafx.h”If the vc++6.0, with this line.
#include “stdio.h”
int main(void){
int a[10]={1,2,3,4,5,6,7,8,9,10},i,j,x;
printf(“Enter a number to delete。\n”);
scanf(“%d”,x);输入要删除的元素值
for(i=0;i10;i++)找要删除的元素
if(a[i]==x)
break;找到后跳出循环
if(i10){
for(j=i+1;j10;a[i++]=a[j++]);找到后后续元素依次向前移动一位
j=9;因为删除了一位,长度变为9
}
else{
printf(“Not find %d。\n”,x);
j=10;没有找到,长度仍为10
}
for(i=0;ij;printf(“%d “,a[i++]));结果输出来看看
printf(“\n”);
return 0;
}
c语言怎么调用数组
c语言可以用数组元素的方法或指针的方法调用数组。
int a[100],i;
for(i=0;i100;i++)
scanf(“%d”,a[i]);
for(i=0;i100;i++)
printf(“%d “,a[i]);
也可以:
int a[100],*p;
for(p=a;pa+100;p++)
scanf(“%d”,p);
for(p=a;pa+100;p++)
printf(“%d “,*p);