首页 > 其他分享 >标准C语言3

标准C语言3

时间:2024-05-05 16:11:52浏览次数:30  
标签:10 arr 初始化 int C语言 标准 编译器 数组

一、数组

什么是数组:

​ 数组就是变量的组合,是一种批量定义变量的方式

如何定义数组:
类型名 数组名[数量];
	int arr[8];//	相当于定义了8个int类型的变量
	int a1, a2, a3,...;
访问数组中的变量:
数组名[下标];
	下标从0开始,范围0~数量-1
遍历数组:

与for循环配合,使用循环变量作为数组遍历的下标

 	int arr[10];
    for (int i = 0; i < 10; ++i) {
        printf("%d%c",arr[i], " \n"[i == 9]);
    } 
数组的初始化:

数组的元素的默认值也是随机的,如果想要对数组初始化可以使用以下语法:

类型名 数组名[数量] = {v1,v2,v3,...};

1、如果初始化数据过多,编译器会产生警告并丢弃

2、如果初始化数据不足,编译器会自动补0

3、对数组初始化时,数组的初始值可以省略,大括号不能省略,编译器会自动全部补0

4、当使用初始化语法时,数组的数量可以省略,编译器会计算出大括号中数据的个数,然后确定数组的数量

5、初始化语法只能在定义数组时使用,这也是唯一一次能对数组批量访问的机会,后序只能单个元素访问

练习2:输入一个整数,分解显示

例如:输入12321 输出 1 2 3 2 1

​ 输入-12321 输出 - 1 2 3 2 1

int num = 0,cnt = 0;
printf("请输入一个整数:");
scanf("%d",&num);
char arr[10] = {};

if(num < 0) {
    printf("- ");
    num = -num;  // num = abs(num);                                                          
}
while (num) {
    arr[cnt++] = num % 10;
    num /= 10;
}

for (int i = cnt - 1; i >= 0; --i) {
    printf("%hhd ",arr[i]);
}

练习3:输入一个正整数,计算出每个数字出现的次数

123545

arr[10] = {}

arr[5]++

数组与sizeof
int arr[10] = {};
sizeof(数组名)			计算整个数组的总字节数	
   sizeof(arr)
sizeof(数组名[下标])
    sizeof(arr[0])	  计算某个元素的字节数	
万能公式:
	sizeof(arr)/sizeof(arr[0])		计算数组的元素个数

数组越界:

​ 使用非法的下标访问该下标的数组元素,该动作称为数组越界

int arr[10];
arr[10] = 10;	

C语言中当数组越界访问时,编译器不会报错,因为C编译器是不检查数组下标是否合法的,因为这样可以提高代码的编译速度、运行速度

数据越界的后果:(面试题)

​ 1、运气好,一切正常

​ 2、段错误,操作系统发现程序非法访问内存,主动杀死程序

​ 3、脏数据,数据越界访问到了其它程序、数组、变量的数据,破坏了别人的数据

二、二维数组

什么是二维数组:

​ 普通一维数组,可以看做若干个变量排成一排

​ 二维数组,可以把若干个类型相同的变量排成一个方阵

定义二维数组:
类型名 数组名[行数][列数];
int arr[3][5];

[][][][][]
[][][][][]
[][][][][]
访问二维数组元素:
数组名[行下标][列下标];
行下标:0 ~ 行数-1
列下标:0 ~ 列数-1
 
int arr[3][5];
[0][0]  [0][1]  [0][2]  [0][3]  [0][4]
[1][0]  [1][1]  [1][2]  [1][3]  [1][4]
[2][0]  [2][1]  [2][2]  [2][3]  [2][4]
二维数组的遍历:

一般与双层for循环配合,一般外层循环遍历行,内层循环遍历列

	int arr[3][5];
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 5; ++j) {
            printf("%d%c", arr[i][j], " \n"[j == 4]);
        }
    }
二维数组的初始化:

​ 二维数组在初始化时,其它特点与一维数组基本相同

​ 注意:二维数组初始化时,可以省略行数,但是一定不能省略列数,并且要提供初始化数据才可以省略行数,编译器会自动计算元素个数

类型名 数组名[行数][列数] = {{第一行},{第二行},...};
int arr[][5] = {1,2,3,4};	true
int arr[1][] = {1,2,3,4};	false 

三、变长数组

定长数组:

​ 使用常量作为定义数组的长度参数,或者使用初始化数据定义数组时省略长度参数,这些数组都称为定长数组,由编译器最终确定数组的长度

变长数组:

​ 使用变量作为定义数组的长度参数时,称为变长数组,当程序运行时,执行定义数组的语句前,可以改变数组的长度变量,所以数组的长度可以每一次运行都不同,但是一旦数组的长度确定后,都无法改变

int len;
scanf("%d", &len);
int arr[len];
变长数组的优缺点:

​ 优点:可以根据运行的实际需求定义数组的长度,从而节约内存空间

​ 缺点:变长数组不能初始化,对数组的初始化是发生在编译器编译期间,而变长数组的长度是运行到定义语句后才能确定,因此编译器在编译期间无法得知变长数组的长度,因此无法初始化

如何在Ubuntu系统下获取方向键 :

1、下载 getch.h 头文件并移动到共享文件夹目录下

2、在Ubuntu系统下,在共享文件夹目录下右键-打开终端,执行以下命令

sudo cp getch.h /usr/include/
sudo chmod 644 /usr/include/getch.h

3、测试方向键的键值

int main() {
    for(;;) {   
        int cmd = getch();  //  获取按下的按键的键值
        printf("%d\n",cmd);
        if(183 == cmd) {
            //	按上的操作
        }
    }                                                               
}
//	上183  下184 左186 右185

项目:走迷宫

#include <stdio.h>
#include <getch.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, 1, -1};
char g[][10] = {
	"##########",
	"###.###...",
	"#...###.##",
	"###.#.#.##",
	"###.#.#.##",
	"#..@..#.##",
	"#.#.#...##",
	"#.#.#.#.##",
	"#.###.#.##",
	"##########",
};
void print() {
	system("clear");
	for (int i = 0; i < 10; ++i) {
		for (int j = 0; j < 10; ++j) {
			printf("%c", g[i][j]);
		}
		puts("");
	}
}
int main() {
	print();
	int times = time(0);
	int sx = 6, sy = 4;
	while (true) {
		int sx = -1, sy = -1;
		for (int i = 0; i < 10; ++i) {
			for (int j = 0; j < 10; ++j) if (g[i][j] == '@') {
				sx = i, sy = j;
			}
		}
		int get = getch() - 183;
		int fx = dx[get] + sx, fy = dy[get] + sy;
		if (fx < 0 || fy < 0 || fx >= 10 || fy >= 10) {
			print();
			printf("times: %d", (int)time(0) - times);
			break;
		} else if (g[fx][fy] == '.') {
			g[fx][fy] ^= g[sx][sy] ^= g[fx][fy] ^= g[sx][sy];
		}
		print();
	}
}

附:getch.h文件内容

#ifndef GETCH_H
#define GETCH_H

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

// 修改终端的控制方式,1取消回显、确认 2获取数据 3还原
static int getch(void)
{
    // 记录终端的配置信息
    struct termios old;
    // 获取终端的配置信息
    tcgetattr(STDIN_FILENO,&old);
    // 设置新的终端配置   
    struct termios new_1 = old;
    // 取消确认、回显
    new_1.c_lflag &= ~(ICANON|ECHO);
    // 设置终端配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&new_1);

    // 在新模式下获取数据   
    int key_val = 0; 
    do{
    	key_val += getchar();
    }while(stdin->_IO_read_end - stdin->_IO_read_ptr);

    // 还原配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&old); 
    return key_val; 
}

#endif//GETCH_H


标签:10,arr,初始化,int,C语言,标准,编译器,数组
From: https://www.cnblogs.com/sleeeeeping/p/18173571

相关文章

  • 对C语言符号的一些冷门知识运用的剖析和总结
    符号目录符号注释奇怪的注释C风格的注释无法嵌套一些特殊的注释注释的规则建议反斜杠'\'反斜杠有续行的作用,但要注意续行后不能添加空格回车也能起到换行的作用,那续行符的意义在哪?反斜杠的转义功能单引号和双引号字面值,字符串,字符,字符变量的大小为什么sizeof('1')的大小是4?c......
  • 标准C语言2
    二、常量(了解)​ 常量就是程序运行过程中不能改变的量,C语言中常量有:字面值常量、宏常量、枚举常量。字面值常量100 int100l long100ll longlong100u unsignedint100lu unsignedlong100llu unsignedlonglong定义一个宏常量表示100年总共有多少秒,不考虑闰平年 #defin......
  • C语言 子进程段错误后变成僵尸进程
    空指针获取首元素时出现段错误,子进程异常退出,父进程没有处理。#include<stdio.h>#include<unistd.h>intmain(){pid_tpid;pid=fork();if(pid>0){printf("fatherprocessisPID:%d\n",getpid());while(1){......
  • 标准C语言1
    一、C语言介绍​ 丹尼斯.里奇和肯.汤普逊在1971~1973年美国贝尔实验室,在开发UNIX操作系统时,在BCPL语言的基础上(newB语言),发明第一款高级编程语言,取BCPL第二个字母作为名字,所以叫C语言​ BCPL->newB->C->UNIX->Minix->Linux​ 它是为了开发操作系统而研发的一款编程语言,它特......
  • C语言 父子进程不能共享全局变量
    父子进程不能共享全局变量。父子进程中的任何一方修改了全局变量,只是修改了副本,只对自己可见,对另一方不可见。C语言中即使加了static也不行。#include<stdio.h>#include<unistd.h>//初始值是0intflag;intmain(){pid_tpid;//父进程和子进程执行相同代码即......
  • Go-标准库秘籍(全)
    Go标准库秘籍(全)原文:zh.annas-archive.org/md5/F3FFC94069815F41B53B3D7D6E774406译者:飞龙协议:CCBY-NC-SA4.0前言感谢您给予本书机会!本书是一本指南,带您了解Go标准库的可能性,其中包含了许多开箱即用的功能和解决方案。请注意,本书涵盖的解决方案主要是对标准库实现的简......
  • C语言转写成MIPS指令集汇编以及MIPS指令集汇编中函数调用时栈的变化
    一、问候语欢迎你来到我的博客!二、C语言代码分析  这段C语言代码共有3个函数组成。set_array函数传入1个int类型的变量num,并创建了1个int类型临时变量i和1个临时int类型数组array,里面含有10个单位,此函数主要目的是调用compare函数,并将num和i传入该函数中,得到其函数返回值......
  • 05. C语言数组
    数组用于将多个数据集中存储,方便管理,此文将集中存储任何类型数据的语句都称为数组,数组根据存储数据的类型和方式分为同型数组、结构体、共用体、枚举。 【同型数组】同型数组也直接称为数组,用于存储多个类型相同的数据,数组内的数据称为数组元素,数组元素占用连续的虚拟地址,每个......
  • 浙大版C语言程序设计习题11-17
    点击查看代码typedefstructNODE{intdata;structNODE*next;}NODE,*Linkedlist;//初始化头节点voidInit(Linkedlist&L){L=(NODE*)malloc(sizeof(NODE));L->next=NULL;}//尾插法创建链表LinkedlistCreateFromRear(LinkedlistL){NODE*rear=L;for......
  • C语言代码题
    C语言代码--练习题试写一个函数,计算字符串s中最大连续相同的字符个数。例如,若s为"aaabbbb",则返回值为4;若s为"abcde",则返回值为1。#include<stdio.h>/******************************************************************************functionname:max_sam......