c语言多个数组
㈠ c语言中,多维数组和多个数组,哪一种更效率
如果你学过编译了你就知道多维数组的访问比一位数组在编译时要更加复杂,在符号表中需要保存的内情向量也会跟大。就用你给出的例子说明:a[i][j]实际对应的内存偏移地址是由base(a)+(i*array(a,1)+j)*sizeof(a)这个公式计算得来的。其中base(a)表示数组a的基地址,而array(a,1)表示数组a的一维维度大小。而b[i]对应的偏移地址则是由base(b)+i*sizeof(b)。而对数组元素的访问实际就是对数组元素所对应的内存偏移地址的访问。由此可见数组每多一维,在访问其变量时就得多做一次乘法,并且编译后生成的中间代码也会更长,效率自然要低。
但是,我个人推荐没有必要非得为这点效率而回避多维数组。其一,是因为在连续访问多维数组时,你的编译器会为你做优化,从而大大提高访问效率,优化后的效率损失可以忽略不计。其次,如果数组是在堆上分配的,那就是一片连续的内存空间。比几片零散的空间更加规整。再者,如果你写有关多维矩阵的程序。固执的使用低维数组会大大增加程序复杂度并降低可读性,甚至效率反而会降低。总之,我们还是不要捡了芝麻,丢了西瓜的好。
㈡ c语言中怎样给指针中添加多个数组的元素
数组指针(也称行指针)
定义
int
(*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int
a[3][4];
int
(*p)[4];
//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;
//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;
//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义
int
*p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样
*p=a;
这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int
*p[3];
int
a[3][4];
p++;
//该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int
*p[3]
表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。
㈢ c语言怎么把一个字符数组分成多个数组
可以使用strtok函数把一个字符数组分解成多个字符数组。
1、strtok函数:
原型:char *strtok(char s[], const char *delim);
功能:将一个字符串分解为一组字符串,s为要分解的字符串,delim为分隔符字符串;
说明:当strtok函数在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针;
头文件:string.h;
返回值:从字符串s开头开始的一个个被分割的字符串。分割结束时,返回NULL。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
2、例程:
#include<stdio.h>
#include<string.h>
intmain(){
charinput[16]="abc,d,ef,g";//待分解字符串
char*delim=",";//分隔符字符串
char*p=strtok(input,delim);//第一次调用strtok
while(p!=NULL){//当返回值不为NULL时,继续循环
printf("%s ",p);//输出分解的字符串
p=strtok(NULL,delim);//继续调用strtok,分解剩下的字符串
}
return0;
}
㈣ C语言怎么定义多个数组储存字符串,又要求逐个输入
可以定义一个字符型二维数组,并依次输入。
比如输入10个字符串,每个字符串最大长度不超过100,那么代码可以写作:
char
str[10][100];
int
i;
for(i
=
0;
i
<
10;
i
++)
scanf("%s",
str[i]);//逐个输入。
for(i
=
0;
i
<
10;
i
++)
printf("%s\n",
str[i]);//将输入的字符串依次输出以确认结果。
㈤ 计算机二级中c语言 一条语句可以定义多个数组什么意思
就像这样
int
a[4],b[4],c[4];
C的程序由若干个语句组成,一个语句就是一个命令,语句的标志符号是分号,
这条语句中定义了a
b
c三个数组
㈥ c语言循环中如何输出多个数组
C语言输出数组时,需要根据数组下标,或者指针移动进行输出。
所以,一般不会用一个循环输出多个数组,这样操作不方便,而且降低效率。
常规的做法是,在多个循环中,各自输出不同的数组。
示例代码如下:
#include<stdio.h>
intmain()
{
inta[10],b[20];
inti;
for(i=0;i<10;i++)
scanf("%d",a+i);//输入a
for(i=0;i<20;i++)
scanf("%d",b+i);//输入b
for(i=0;i<10;i++)
printf("%d,",a[i]);//输出a
for(i=0;i<20;i++)
printf("%d,",b[i]);//输出b
return0;
}
㈦ 紧急!C语言多个数组问题!!!
#include<stdio.h>
int main()
{
int i,j = 0,a[7],b[7],c[7],max;
//1.声明的数组最好初始化
for(i = 0;i < 7;i++)
{
a[i] = 0;
b[i] = 0;
c[i] = 0;
}
//2.界面可以人性化一点,方便自己和别人使用
//以下是输入数据
for(i = 0;i < 7;i++)
{
printf("Day.%d\n",i+1);
scanf("%d%d",&a[i],&b[i]);
c[i]=a[i]+b[i];
printf("StudyTime:%d\n",c[i]);
}
//3.功能模块也可以分清楚一点,不必一下子把什么事情都做完
//以下是分析比较数据,和你的不太一样,我用MAX来存储最大的数据,用J来记录最忙的日子
//个人认为这样的程序更加易读
max = c[0];
for(i = 0;i < 7;i++)
{
if(max < c[i])
{
max = c[i];
j = i;
}
}
printf("\n");
//最后的输出没按题目要求来,用了人性化的输出。
if(max<=8)
printf("A Happy Week^^\n%d",0);
else
printf("The Busy Day is:%d\n Her study time is:%d\n",j, max);
return 0;
}
/*感觉像电子宠物o(∩_∩)o...建议编程的时候层次清楚一点,易读性是相当重要的哦*/
㈧ C语言中如何用栈存储多个二维数组
typedef struct{
int left_pos; //左边栈顶,靠0方向
int right_pos; //右边栈顶,靠MAXSIZE-1方向
int split_pos; //左右栈分割位置
int stack[MAXSIZE];
}DoubleStack;
初始的时候,为了能够高效方便的让2个栈进数据,建议把split_pos设置为MAXSIZE/2,也即中间,并初始化 left_pos,right_pos也为MAXSIZE/2;typedef struct{
int left_pos; //左边栈顶,靠0方向
int right_pos; //右边栈顶,靠MAXSIZE-1方向
int split_pos; //左右栈分割位置
int stack[MAXSIZE];
}DoubleStack;
初始的时候,为了能够高效方便的让2个栈进数据,建议把split_pos设置为MAXSIZE/2,也即中间,并初始化 left_pos,right_pos也为MAXSIZE/2;
㈨ c语言关于多个数组的排序问题
//1你没有理解冒泡排序原理,应该和内层循环个元素交换,所以把变量i+1替换为变量j
//2strcmp函数不会用,应该传指针,因为只有这样才能比较两个字符串。
#include<stdio.h>
#include<string.h>
intmain()
{
inti,j;
char*temp;char*p[6];
chara[6][6];
printf("请输入你想比较的字符串");
for(i=0;i<6;i++)
{
p[i]=a[i];
}
for(i=0;i<6;i++)
{scanf("%s",p[i]);
}for(i=0;i<6;i++)
{
for(j=i;j<6;j++)
{
if(strcmp(p[i],p[j])>0)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
for(i=0;i<6;i++)
{
printf("%s ",p[i]);
}
return0;
}