关于c++:初学小白学习CC基本知识笔记数组与字符

2次阅读

共计 6981 个字符,预计需要花费 18 分钟才能阅读完成。

一、介绍数组

一个常量变量就是一个用来存储数值的命名区域。同样,一个数组就是一个用来存储一系列变量值的命名区域,因而,能够应用数组组织常量变量。也就是说,数组是一组有序数据的汇合,存储在数组中的值称为数组元素。每个数组元素有一个相干的索引(也称为关键字),它能够用来拜访元素。在大多数编程语言中,数组都具备数字索引,而且这些索个通常是从 0 或 1 开始的。数组中的每个元素都属于同一个数据类型。
一维数组是由数字组成的以单纯的排序构造排列的构造繁多的数组。一维数组是计算机程序中最根本的数组。二维及多维数组能够看作是一维数组的屡次叠加产生的。

二、一维数组

当数组中每个元素都只带有一个下标时,称这样的数组为一维数组。通过给出的数组名称和这个元素在数组中的地位编号(即下标),程序能够援用数组中的任意一个元素,一维数组的援用定义格局为:类型 + 数组名 [下标] 如:int a[10]
其中,a 是一维数组的数组名,该数组有 10 个元素,顺次示意为 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]。须要留神的是,数组是从零开始是, 所以 a[10]不属于这一个数组的空间范畴中。当在阐明局部定义了一个数组变量后,编译程序会在内存空间中开拓一串间断的存储单元。对于数组而言,程序的执行局部应用的是数组变量而不是数组类型。在援用时,下标必须是整数,但能够是整型变量或整型表达式。如果应用表达式,会先计算表达式以确定下标。程序只能一一利用数组中的元素而不能一次援用整个数组,再定义数组时,须要指定数组中元素的个数,方括号里边的常量数值示意了数组的长度。在数组定义前加 const 关键字可将整个数组变为只读,将不再能够对数组进行写入数据。如:int a; float a[10]; (非法) int n=5; int a[n];(非法) int a[5+6]; (非法的)

初始化:(留神,在应用数组之前,肯定要先初始化)1、数组的初始化能够在定义时一并实现 2、能够只给局部元素赋初值,其余的元素赋 0。3、如给全副元素赋值,则在数组中阐明,能够不给出数组元素的个数 4、数组的初始化能够是用循环进行输出数值赋值,也能够是在程序中指定赋值

例子:

#include<stdio.h>// 寻找数字并查看在哪个地位​
int search(int n, int a[], int max);
​int main(void) 
{int a[] = {1,6,5,7,4,3,2,8,11,9,10};// 初始化一      
          /* int a[10] = {0}// 初始化二  全都初始化为零         
       for (i = 0; i < 10; i++) {
// 初始化三本人输出初始化(这种初始化最好定义在二之上,否则其余如果有元素没有被赋值的话会出错)scanf("%d", &a[i]);            
 }           
     */    int n;    scanf("%d", &n);       

     // 整个数组占用的字节数可用 sizeof(a)示意进去  
  int h = search(n, a, sizeof(a) / sizeof(a[0]));
// 用整个数组占用的字节数除以首元素的字节数可晓得数组的大小​   
 
if (h != -1) {​ 
printf("%d 在第 %d 位上", n, h+1);  
  }else {printf("没有这个数字");  
  }​  
  return 0;
}
int search(int n, int a[], int max) {  
     int t = -1;  
      int i;​ 
   for (i = 0; i < max; i++) {// 遍历数组     
   if (n == a[i]) 
    {            t = i;        
    break;    }​​  
 }   
 return t;
} 


学习材料 (工具安装包) 支付

三、二维数组

二维数组实质上是以数组作为数组元素的数组即“数组的数组”,类型说明符 数组名[常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵 ai = aj​二维数组 Am,这是一个 m 行,n 列的二维数组。设 ap 为 A 的第一个元素,即二维数组的行下标从 p 到 m +p,列下标从 q 到 n +q,按“行优先程序”存储时则元素 ai 的地址计算为:(t 为一个字节数)LOC (ai) = LOC(ap) + ((i − p) n + (j − q)) t 按“列优先程序”存储时,地址计算为:LOC(ai) = LOC(ap) + ((j − q) m + (i − p)) t 寄存该数组至多须要的单元数为(m-p+1) (n-q+1) t 个字节二维数组只是模式上的二维,然而在计算机外部它的存储形式还是间断的线性的,它只是一种非凡的一维数组。

二维数组的定义和一维数组的概念规定根本类似,个别模式为:类型说明符 + 数组名【常量表达式】。

初始化稍有不同 留神,二维数组的列数是必须要给出的,行数是能够有编译器来数。每行一个 {},逗号拆散 最初的的逗号能够存在(有古老的传统)如果省略,示意补零。
例子:杨辉三角

#include<stdio.h>// 杨辉三角
int main(void) { 
   int n;   
 scanf("%d", &n);   
 int i, j;  
  int a[100][100] = {0};// 先把所有元素初始化为零  
  // 由与二维数组有两个下标,所以它的遍历须要双重循环来实现     
   for (i = 0; i < n; i++) {a[i][0] = a[i][i] = 1;// 将第一位数字和最初一位数组初始化为 1   
 }​   

     int t;​  
  for (i = 1; i <=n; i++) {// 遍历赋值​  
  for (j = 1; j <=i-1; j++) {a[i][j] = a[i - 1][j-1] + a[i - 1][j];// 每一位上的数字相当于两肩上的和     
       }      
  }​    

for (i = 0; i < n; i++) {// 遍历输入​   
     for (t = i; t < n; t++) {printf(" ");     
   }          
    for (j = 0; j <=i; j++) {printf("%6d", a[i][j]);      
  }         
   printf("n");     
   }​​  
  return 0;
} 

Tips
1、编译器和运行环境都不会查看数组的下标是否越界,无论是对数组的单元读还是写,一旦程序运行,越界的数组拜访就可能造成问题,导致程序解体。
2、但有时候也有可能运气好,不会造成严重后果。
3、所以这是程序员的责任来放弃程序只应用无效的下标值,:[0 – 数组的大小减 1]
4、数组能够呈现在赋值号的右边或左边,在右边叫左值,在左边叫右值
5、如果在定义数值型数组时,指定了数组的长度,并且对其初始化,但凡未被“初始化”的元素,零碎有时候会主动将它们初始化为零,如果是字符型,则初始化为‘0’,如果是指针型,则初始化为 NULL,即空指针,不过,最好还是本人初始化好比拟好。

四、字符的输入输出

** 有五种输出:gets(),getchar(),getch()scanf() fgets()(文件类)
有五种输入:puts(),putchar(),putch(),printf() fputs()(文件类)**
(1)输出:
1、gets()函数原形 :char gets(char ptr); 用于从规范输出流 stdin 读入一个整(以’n’或 EOF)完结,并且回车键会被过滤掉,不会被读到字符串中,写入指向的字符数组,并返回这个指针;出错或袭遇到文件完结时则返回 NULL。行末的’n’从流中取出,但不写入数组。gets() 不查看被写入的数组大小。其能够有限读取,不会判断下限,以回车完结读取

2、getchar()函数原形 :int getchar(void); 每次只读入一个字符,用于从规范输出流 stdin 读入字符,括回车键也会被读成一个字符,并返回这个字符。如果读到文件结尾,则返 EOF。留神到 EOF 不能用 char 类型示意,所以 getchar() 函数返回的是一个 int 型的数。它输出的字符被寄存在 sewll 的缓冲区中,直到用户按回车才会执行,然而如果你输了多个字符,当前的 getchar()再执行时就会间接从缓冲区中读取了。

#include<stdio.h>i
nt main(void) {char n[5] = {0};​int a = getchar(n);// 第一次屡次输出字符(应用 getchar 时须要定义一个变量临时存放数据)int c = getchar(n);// 前面这些就是间接从 a 输出的哪些被放到缓冲区的读取了
int b = getchar(n);​
printf("%c", a);
printf("%c", b);
printf("%c", c);​            
    // 输出 abc          
   char p;​     
   // p=getch();// 用它不必按回车键  
        p=getchar();   
      int b = getchar();       
    int c = getchar();     
     putchar(p);// 输入 abc    
    putchar(b);     
    putchar(c);​​} 

3、getch()函数原形 :int getch(void); 它的性能和 getchar 基本相同,差异在 getch 是间接从键盘获取值,不等用户按键,它间接返回用户输出的 ASCII 码值,出错就返回 -1(getchar 和 getch 都能够用来放在程序的开端,当作“暂停键”应用,此时圆括号不须要参数,按任意键持续)。
4、scanf() 做为单个字符输出时应用 %c 数据类型符,用于字符串时应用 %s 数据类型符(留神应用 %s 时不必加 &)。

(2)输入:

1、puts()函数原形 :int puts(const char *s); 返回值:用来向规范输出设备(屏幕)输入字符串并换行,把字符串输入到规范输出设备,将’0’转换为回车换行,只能输入字符串, 不能输入数值或进行格局变换,能够将字符串间接写入 puts() 函数中:puts(“Hello, world!”);(puts()和 gets()都是数组函数,输出或输入前要定义数组,一个简略的输出后再将输出的货色输入)(puts(st);st 为数组名)。

2、putchar()函数原形:int putchar(int char); 返回值:该函数以无符号 char 强制转换为 int 的模式返回写入的字符,当输入正确的时候,返回输入字符转换为的 unsigned int(无符号)值,当输入谬误的时候,返回 EOF(End of file)文件结束符,表达式能够是字符型或整型,它每次只能输入一个字符 如:“putchar(’#’)”输入字符“#”(其函数度原型在 stdio.h 中)。

3、putch()函数原形:int putch(int ch);返回值:如果输入胜利,函数返回该字符;否则返回 EOF。在以后光标处向文本屏幕输入字符 ch,而后光标主动右移一个字符地位(其函数原型在头文件 conio.h 中)。应用形式:1、putch(‘转义字符’);2、putch(‘单个字符’);3、putch(字符变量);注:需先定义 char 字符变量=’单个字符’;

4、printf()做为单个字符输入的时候应用 %c 数据类型说明符,做为字符串输入时应用 %s 数据类型说明符(puts()的输出和 printf 的输入是有肯定的区别的,puts()遇到‘0’就终止,而用 printf 则不会这样。)(printf 函数可输入各种不同类型的数据,putchar 函数只能输入字符数据,而 puts 函数可输入字符串数据。)

五、单字符数组

字符数组是指用来寄存字符数据的数组。其定义的个别模式为:char 数组名 [数据长度]。字符数组用于寄存字符或字符串,字符数组中的一个元素寄存一个字符,它在内存中占用一个字节。用来寄存字符数据的数组称为字符数组。字符数组中的一个元素寄存一个字符。定义字符数组的办法与定义数值型数组的办法相似。因为字符型数据是以整数模式(ASCII 代码) 寄存的,因而也能够用整型数组来寄存字符数据。但这时每个数组元素占 2 个字节的内存单元,节约存储空间,它也能够是多维数组。

初始化:

  • 1、字符数组的初始化与数值型数组初始化没有本质区别。但它除了能够一一给数组元素赋予字符外,也能够间接用字符串对其初始化。
  • 2、用字符常量一一初始化数组:char a[5]={‘a’,‘b’,‘c’,‘d’,‘e’,}; 把 8 个字符顺次别离赋给 c[0]~c[4]这 5 个元素。
  • 3、如果在定义字符数组时不进行初始化,则数组中各元素的值是不可意料的。如果字符个数大于数组长度,则呈现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中后面那些元素,其余的元素主动定为空字符(即’0’)。如果提供的初值个数与预约的数组长度雷同,在定义时能够省略数组长度,零碎会主动依据初值个数确定数组长度。

例子:输出一行字符,统计其中有多少个单词和有多少个 a(大小写都算),单词之间用空格分隔开:

#include<stdio.h>
int main(void) 
{​  
  char a[100] = {0};  
  int sum = 0;  
  gets(a);// 字符的输出函数      
          int i=0;    
    int t = 0;  
      while(1){​      
      if (a[i] == '0') {break;}else if (a[i] == ' ') {sum++;}        
    if (a[i] == 'a' || a[i] == 'A') {t++;}         
       i++;       
 }​      
  printf("有 %d 个单词,%d 个 a", sum+1, t);​     
   return 0;
} 

六、字符串(数组)

1、C 语言中没有字符串类型,字符串是寄存在字符型数组中。字符反映在事实中就是文字、符号、数字等人用来表白的字符,反映在编程中字符就是字符类型的变量。C 语言中应用 ASCII 编码对字符进行编程,编码后能够用 char 型变量来示意一个字符。C 语言的字符串就是多个字符打包在一起独特组成的,字符串在内存中其实就是多个字节间断散布形成的。

2、字符串通常以串的整体作为操作对象,以整数 0(‘0’也一样)或 NULL 结尾的,‘0’标致着字符串的完结也是字符串的标记,然而计算长度时不包含这个 0,这里补充一点:字符串在存储上相似字符数组,所以它每一位的单个元素都是能够提取的,如 s =“abcdefgij”,则 s[1]=“b”,s[9]=“j”,而字符串的零位正是它的长度,如 s[0]=10,这能够给咱们提供很多不便,如高精度运算时每一位都能够转化为数字存入数组。

3、字符串或串 (String) 是由数字、字母、下划线组成的一串字符。个别记为 s=“a1a2···an”(n>=0)。字符(string)是符号或数值的一个间断序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。串的两种最根本的存储形式是顺序存储形式和链接存储形式。
4、C 语言的字符串不能使用运算符对其操作,通过数组的形式能够遍历字符串,惟一非凡的中央就是字符串字面量能够用来初始化字符数组,字符串以数组的模式呈现,以数组或指针的模式拜访(更多的时候是用指针的模式)C 语言规范库和 string.h 头文件里提供了一系列的字符串操作函数。

5、字符串常量:char s=“Hello world”; s 是一个指针,初始化指向一个字符串常量,因为这个常量所在的中央,所以实际上 s 是 const 的 char s,但因为历史的起因,编译器承受不带 const 的 char * s 的写法,然而如果试图对 s 所指的字符串做写入有可能会造成严重后果,所以 如果须要批改字符串,应该用数组,char s[] =“Hello world”;

” Hello” 会被编译器变成一个字符数组放在某处,这个数组的长度是 6,结尾还会有个零示意完结,两个相邻字符串常量会被主动链接起来。

初始化

1、间接用字符数组的办法初始化:char str[10]={‘I’,’‘,‘a’,‘m’,’‘,‘h’,‘a’,‘p’,‘p’,‘y’};(字符数组的赋值只能按元素一一赋值)
2、应用输出字符的输出函数进行输出赋值
3、也能够省略花括号:char str[]=“I am happy”;

Tips
字符串能够代表为 char_的模式,然而 char * 不肯定是字符串,本意是指向字符的指针,可能指向的是字符的数组(就像 int_一样)留神:只有它所指的字符数组开端有 0,能力说它所指向的是字符串。
char *a =“Hello”和 char b[]=“Hello”的不同,做为数组的时候,它是个常量(这个字符串在这里)。做为指针,它是个变量(这个字符串不晓得在哪里)(指针 能够用来解决参数,动态分配空间)所以:如果要结构一个字符串—> 用数组,如果要解决一个字符串—> 用指针。

 c 语言中字符串是通过字符指针来间接实现的
 char *p="linux";    // 字符串
   char a[]="linux;    // 字符数组
   printf("p=%s.n",p);  
   printf("a=%s.n",a); 

字符 (串) 解决头文件
1、#include <string.h> // 字符串解决
2、#include <ctype.h> // 字符解决
<string.h> 里别离蕴含有以下这些函数:(详解:baike.baidu.com/item/string…)
strlen 求字符串长度
strcmp 比拟 2 个字符串是否一样
strcat 字符串连贯操作
strcpy 字符串拷贝操作(要求两个字符串长度足够)
strncat 字符串连贯操作(前 n 个字符)
strncpy 字符串拷贝操作(前 n 个字符)
strchr 找一个字符,查问在字符串中第一个呈现这个字符的地位
strstr 查问 s1 是否是 s2 子串
<ctype.h> 里别离蕴含以下这些函数:(详解:www.cnblogs.com/lixiaohui-a…)


点击这里间接学习
(应用函数时利用返回值来操作)对于字符串的操作还有 sprintf(把格式化的数据写入某个字符串中)和 sscanf(读取格式化的字符串中的数据)这两个函数。

正文完
 0