整型数组,字符串,字符数组的使用

相同类型若干变量按有序形式组织起来形成数组
*
数组是在内存中连续的相同类型的变量空间

变量的定义:数据类型 变量 = 值;

数组的定义:数据类型 数组名[元素个数] = {值1,值2,值3};

数据的提取使用:数组下标 数组名[下标] (下标从0开始)

利用循环提取:

eg1
for(int i=0;i<10;i++)
{
printf("%d\n",arr[i]);
}

数组在内存中的储存方式和大小

1、 储存方式
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%p\n",&arr[0]); //后面只能写到arr[9],元素地址(十六今进制)
printf("%p\n",arr); //数组名表示首地址常量

2、 大小(数据类型*元素个数)
printf(“数组在内存中的大小:%d\n”,sizeof(arr)); //结果为40
printf(“数组元素的大小:%d\n”,sizeof(arr[0])); //结果为4
printf(“数组元素的个数:%d\n”,sizeof(arr)/sizrof(arr[0])); //结果为10

数组的格式

eg2
#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<sizeof(arr)/sizrof(arr[0]);i++);
{
printf("%d\n",arr[i]);
}
return EXIT_SUCCESS;
}

int arr[10]={1,2,3,4,5}; //表示后面5位都位0

数组必先知道大小,动态数组–开辟堆空间

通过打印输出

eg3
int main()
{
int arr[SIZE];
for(int i=0;i<SIZE;i++)
{
scanf("%d\n",&arr[i]);
}
for(int i=0;i<SIZE;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}

*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#define SIZE 10
int main1()
{
int arr[SIZE];
for (int i = 0;i < SIZE;i++)
{
scanf("%d", &arr[i]); //%d后面不能加\n,否知显示scanf被忽略
}
int max = 0;
for (int i = 1;i < SIZE;i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf(“最重小猪体重为:%d\n”, max);
return EXIT_SUCCESS;
}

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>

//数组的逆置

int main2()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
int j = sizeof(arr) / sizeof(arr[0]) - 1; //数组元素个数
while (i < j)
{
int temp = arr[i]; //
arr[i] = arr[j]; //通过临时变量交换数据
arr[i] = temp; //
i++;
j–;
}
for (int i = 0;i < 10;i++ )
{
printf("%d\n", arr[i]);
}
return EXIT_SUCCESS;
}

//冒泡法排序

int main3()
{
int arr[] = { 1,2,3,4,5,6,7,9,8,10 }; //定义数组同时初始化所有元素变量
int i = 0;
int j = 0;
int n = sizeof(arr) / sizeof(arr[0]); //数组中元素个数
int temp;
for (i = 0;i < 9;i++) //控制循环次数(外层执行次数=元素个数-1)
{
for (j = 0;j < 9 - i;j++) //内循环目的是比较相邻元素,将大的元素放后面
{
if (arr[j] > arr[j + 1]) //每次比较次数=元素个数-1-执行次数
{
int temp = arr[j]; //
arr[j] = arr[j + 1]; //数据逆置步骤
arr[j + 1] = temp; //
}
}
}
for (int i = 0;i < 10;i++)
{
printf("%d\n", arr[i]);
}
return EXIT_SUCCESS;
}

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
/*
一维数组:数组名[元素个数]={值1,值2,值3};
二维数组:数组名[行][列]={{值1,值2},{值1,值2}};

初始化:int arr[2][3]={{1,2,3},{4,5,6}};
arr[1][2] 表示值 6
*/

eg
int main4()
{
int arr[2][3] = { {1,2,3},{4,5,6} };
for (int i = 0;i < 2;i++)
{
for (int j = 0;j < 3;j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
printf(“二维数组大小:%d\n”, sizeof(arr)); //行元素类型int=4
return EXIT_SUCCESS;
}

printf(“二维数组一行大小:%d\n”, sizeof(arr[0]));
printf(“二维数组一个元素大小:%d\n”, sizeof(arr[0][0]));
printf(“二维数组行数:%d\n”, sizeof(arr)/sizeof(arr[0]));
printf(“二维数组列数:%d\n”, sizeof(arr[0])/sizeof(arr[[0][0]));
*/

/*二维数组首地址
printf("%p\n", arr);
printf("%p\n", arr[0]);
printf("%p\n", &arr[0][0]); //得加&,因为arr[0][0]是一个数值
printf("%p\n", arr[1]); //第二行首地址
*/

//通过循环打印出全部地址
int main5()
{
int arr[2][3] = { {1,2,3},{4,5,6} };
for (int i = 0;i < 2;i++)
{
for (int j = 0;j < 3;j++)
{
printf("%p\n", &arr[i][j]);
}
}
return 0;
}

/*
二维数组中列的值不能省略
eg
arr[][3]

eg
arr[][3]={1,2,3,4,5,6};
表示:1 2 3
4 5 6
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>

/*学生考试
定义一个数组,存储有5名学生的3门成绩
求出每名学生总成绩和平均成绩
求出每门学科的总成绩和平均成绩
*/

int main6()
{
int arr[5][3]; //学生行(横) 成绩列(竖) 第一行为第一名学生的3门成绩 第一列为一科学科的5名学生各自成绩
for (int i = 0;i < 5;i++) //获取学生成绩
{
for (int j = 0;j < 3;j++)
{
scanf("%d", &arr[i][j]);
}
}
//打印学生成绩
for (int i = 0;i < 5;i++)
{
for (int j = 0;j < 3;j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
for (int i = 0;i < 5; i++)
{
int sum = 0;
for (int j = 0;j < 3;j++)
{
sum += arr[i][j];
}
printf(“第%d名学生总成绩:%d的\t平均成绩为:%d\n”, i + 1, sum, sum/3);
}
for (int i = 0;i < 3;i++)
{
int sum = 0;
for (int j = 0;j < 5; j++)
{
sum += arr[i][j];
}
printf(“第%d门学科的总成绩为:%d\t平均成绩:%d\n”, i + 1, sum, sum/5);
}
return EXIT_SUCCESS;
}

/*多维数组
一维数组:数据类型 数组名 [元素个数]
二维数组:数据类型 数组名 [行][列]
三维数组:数据类型 数组名 [层][行][列]

eg
int main[2][3][4]=
{
{
{1,2,3,4}
{2,3,4,5} 1层
{6,8,9,7}
}
{
{4,5,6,7}
{5,6,7,8} 2层
{6,7,8,9}
}
}

*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>

/*
字符串指针变量:本身是一个变量,用于存放字符串的首地址。

字符串:本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。

字符数组:是由于若干个数组元素组成的,它可用来存放整个字符串
*/

/*
char arr[5]={‘h’,‘e’,‘i’,‘0’,‘k’}; //占5*1个字节

for(int i=0;i<sizeof(arr);i++) //字符串结束标志\0
{ //数字0等同于\0,但不等同于’0’
printf("%c",arr[i]); //‘0’和’\0’的ASCII不同
}

printf("%s",arr); //打印一个字符串,直到遇到\0停止

例子:char arr[5]={‘e’,‘r’,‘t’,‘y’,‘u’} //结果出现古汉字,则要把5改大

%c 输出单个字符 没有\0
%s 输出字符串 有\0
%9s 对字符串个数进行限定

*/

这里是引用
//eg
int main7()
{
//定义一个字符数组存储字符串
char ch[10]; //输入超过9个字符串报错,因为自动包含\0
scanf("%s", ch); //scanf接收空格或者换行符表结束
printf("%d", ch); //eg 输入hello wor 输出hello
return 0;
}

/*

字符串的拼接
*/
int main8()
{
char ch1[6] = “hello”;
char ch2[6] = “world”;
char ch3[20]; //可多不能少
int i = 0;
int j = 0;
while(ch1[i]!=’\0’)
{
ch3[i] = ch1[i];i++;
}
while (ch2[j] != ‘\0’)
{
ch3[i + j] = ch2[j];j++; //每次读一个往里面放
}
ch3[i + j] = ‘\0’;
printf("%s", ch3);
return 0;
}

/*
字符串与字符数组的区别

c语言中没有字符串这种数据类型,可通过char数组来代替
字符串是一个char数组,但char数组不一定是字符串
数字0(和字符\0等价)结尾的char数组就是一个字符串

eg
char arr[100]={110,111,112,0,123,98,99};
printf("%s\n",arr);
结果打印出 nop

赋初值:
字符数组:char arr[]={‘l’‘z’‘o’};
字符串:char arr[]={“ILOVEC”}; //看省略{ }

*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
/*
字符串采用了’\0’标志
scanf("%s",str); //默认以空格分隔
*/

/*
get(str)与scanf("%s",str)的区别
get(str)允许输入字符串含有空格
scanf("%s",str)不允许含有空格,空格表结束 scanf("%[^\n]",ch),此形式可带空格
都无法识别字符串大小,必须遇到换行符或读到文件结尾才接收输入,因此容易导致字符数组越界(缓冲溢出)
解决方法:给大一点元素个数
*/

//eg
int main9()
{
char ch[100]; //通过键盘获取一个字符串
gets(ch);
printf("%s\n", ch);
return 0;
}

/*
fgets()
读取键盘输入的字符串,同时把回车也作为字符串的一部分
通过scanf与gets的输入不包含结尾“\n”
通过fgets的字符串结尾自动多“\n”,因此fgets不存在缓冲溢出问题(越界)
*/

//eg
int main10()
{
char ch[10]; //通过键盘获取一个字符串
fgets(ch,sizeof(ch),stdin); //可接收空格,会把\0作为字符串一部分,占以字节
printf("%s", ch); //输入helloworld 输出helloworld 若是gets,则报错
return 0;
}

/*
puts (在输出完成后自动输出一个“\n”) string
*/

//eg
int main11()
{
char ch[] = “hello world”;
puts(ch); //puts(""); 表示换行
return 0;
}

/*

fputs (在输出完成后不会自动输出一个“\n”) stdout
*/

//eg
int main12()
{
char ch[] = “hello world”;
fputs(ch,stdout);
return 0;
}

/*
strlen() 计算指定字符串s的长度,不包含字符串结束符\0
*/

//eg
int main13()
{ //计算字符串有效个数
char ch[100] = “hello world”;
printf(“数组大小:%d”, sizeof(ch)); //结果100 11
printf(“字符串长度:%d”, strlen(ch)); //若把100去掉 则结果12 11
return EXIT_SUCCESS;
}

int main14()
{
char ch[]= “hello world”;
int len = 0;
while (ch[len] != ‘\0’)
{
len++;
}
printf(“字符串长度:%d”, len);
return 0;
}

原文链接:http://blog.qmgua.com/?id=49

=========================================

http://blog.qmgua.com/ 为 “布尔博客” 唯一官方服务平台,请勿相信其他任何渠道。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸运的涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值