黑马程序员——C语言基础---数组1

                                                                            ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

一、整型变量修饰符介绍

1、改变整型变量所占存储空间 

 计算一个位数的范围-2^(n-1) 到2^(n-1)-1 

short 2字节 %hd

int 4字节 %d %i

long 8字节 %ld

long long 8字节 %lld (主要是为了解决32位机器问题) 

所有修饰符都是用来修整形

* long long 类型, 

32位系统下:

long 4个字节

long long 8个字节 

64位系统下:

long 8个字节

long long 8个字节  

2、改变整型变量的符号  

signed 表示是有符号的(默认的就是有符号数)

unsigned (%u输出)表示是一个无符号的数 (正数的取值范围会扩大一倍)

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {    
    //定义一个short类型的变量
    short int a = 1;  //2个字节  16位
    //10000000 000000000   最小的负数
    //01111111 111111111   最大的正数
    short int a1 = a<<15;  //-32768
    a1 = (a<<15)-1;        //+32767
    printf("%hd\n",a1);    
    //定义一个int类型的变量
    int b = 1;    //4个字节
    //10000000 000000000 000000000 000000000
    //01111111 111111111 111111111 111111111
    int b1 = b<<31;  //-2147483648
    b1 = (b<<31)-1;  //+2147483647
    printf("%d\n",b1);    
    //定义一个long类型的变量
    long int c = 1;
    long int c1 = c<<63;    //-9223372036854775808
    c1 = (c<<63)-1;         //+9223372036854775807
    printf("c1 = %ld\n",c1);    
    //改变一个数的符号
    //表示:原来最高位用作标识一个数的正负,现在用来参与计算
    //计算机默认的事一个有符号数
    //无符号数用 %u来输出   
    //单字节数
    //10000000
    //01111111  +127   
    //11111111  +255   
    //128+64+32+16+8+4+2+1
    //00000000 00000000
    //00000000 00000001
    //11111111 11111111
    unsigned short d = 0-1;
    printf("%u\n",d);    
    //改变一个数的符号
    unsigned int e = 0-1;
    printf("%u\n",e);    
    return 0;
}</span>

二、char类型数据存储 

1、存储原理

char a='a' ----->取出'a'的ASCII码值,97,然后转换2进制,存储在一个字节中 

2、注意事项 

1)当把一个字符赋值给一个char类型变量,那么系统首先查这个字符所对应的ASCII码,然后把 

这个ASCII值放到变量中 

char c = 'a'; printf("%d\n",c);  

2)根据变量中存储的ASCII值,去查ASCII表中对应字符,然后把这个字符打印控制台上,整形和 字符型可以互相转换。 

printf("%c\n",c);  

3)char z = '我'; char字节,一个中文字符占3字节(unicode表),所有char不可以存储中文  

4)不支持多个字符,多个字符是字符串 

char two = 'ac'; printf("%c\n",two);

三、数组的基本概念及分类 

1、基本概念 

在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。 

在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基 本数据类型或是构造类型。 

数组的几个名词 

1)数组:一组具有相同数据类型的数据的有序的集合 

2)数组元素:构成数组的数据。数组中的每一个数组元素具有相同的名称,不同的下标,可以作 为单个变量使用,所以也称为下标变量。 

3)数组的下标:是数组元素的位置的一个索引或指示。 

4)数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维 数组。  

2、按存储的内容分类 

按数组元素的类型不同,数组又可分为:  

数值数组:用来存储数值得 

字符数组:用来存储字符 ‘a’ 指针数组:用来存放指针(地址)的 

结构数组:用来存放一个结构体类型的数据  

3、按维度分类 

一维数组
二维数组
多维数组

四、一维数组定义及注意事项 

1、一维数组介绍 

如果一个数组的所有元素都不是数组,那么该数组称为一维数组  

2、一维数组的定义

变量的使用流程:定义--->初始化--->使用

数组的使用流程:定义数组---->给数组初始化--->使用数组 

在C语言中使用数组必须先进行定义。一组数组的定义方式为: 

类型说明符 数组名[常量表达式];  

类型说明符: 

是任一种基本数据类型或构造数据类型。

数组名 

用户定义的数组标识符。  

方括号中的常量表达式 

表示数据元素的个数,也称为数组的长度。

3、数组定义的注意点

1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。第一个数组元素的地址是数组所占内存块的首地址 

2) 数组名的书写规则应符合标识符的书写规定。 

命名规则: 

1、只能由字母、数字、下划线组成 

2、不能数字开头 

3、不能与关键字重名 

4、严格区分大小写 

命名规范: 

1、起一个有意义名字 

2、驼峰标示 

3) 数组名不能与其它变量名相同。 

4) 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4] 

5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。

<span style="font-size:14px;">#include <stdio.h>
#define M 5
int main(int argc, const char * argv[]) {    
    int a[3];
    float f1[4];
    char ch[5];    
    //注意事项
    //1)数组的长度是可以是一个常量 也可以是常量表达式
    int a1[3+3];  //3+3是常量表达式    
    //2)数组名的命名规则:严格按照标识符的命名规范    
    //3)数组名不能和其他变量同名
    int a4;  //这是一个整型变量
    //int a4[5];//定义了一个整型数组    
    //4)数组的长度不可以为一个变量(C99标准要求的)
    int len =4;
    int a5[len];  //这是我们xcode编译器做的优化
                  //放到c++编译器就报错    
    //5)数组的长度可以使用 宏定义
    int a6[M];    //M是一个宏定义    
    //6)定义数组的时候,还可以定义普通变量
    int x,y,a7[4];  //定义两个整形变量 x y
                    //又定义了一个长度为4 数组名为a7的数组    
    return 0;
}</span>

五、一维数组初始化 

1、一维数组的初始化 

数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样 

将减少运行时间,提高效率。 

初始化方式有两种:定义的同时初始化、先定义,后初始化 

2、定义的同时初始化 

常见形式为:  

类型说明符 数组名[常量表达式] = { 值, 值......值 }; 其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。 

又细分以下几种情况: 

1)指定元素的个数的同时,对所有的元素进行显式的初始化 int nums[5] = {1,2,3,4,5};  

2)指定数组的元素个数,对数组进行部分显式初始化 定义的同时对数组进行初始化,没有显式初始化的元素,那么系统会自动将其初始化为0 

int nums[10] = {1,2};  

3)不指定元素个数,定义的同时初始化,它是根据大括号中的元素的个数来确定数组的元素 个数 

int nums[] = {1,2,3,5,6};  

4)指定元素个数,同时给指定元素进行初始化 int nums[5] = {[4] = 3,[1] = 2}; 

  给数组赋值的方法除了用赋值语句对数组元素逐个赋值外
  还可采用初始化赋值和动态赋值的方法 

注意: 使用变量定义的数组不可以定义数组的同时对数组进行初始化 

3、先定义,后初始化 

//先定义数组,然后对数组进行初始化

//使用常量作为元素个数

int nums[3];

nums[0] = 1;

nums[1] = 2;

nums[2] = 3;

// 使用变量作为元素个数:c99不支持使用变量作为元素个数,但llVM编译 器,它支持 

4、为什么要初始化数组? 

1)数组如果没有初始化,数组中到底有没有值?啥东西? 

如果定义数组后,没有初始化,数组中是有值的,是随机的垃圾数,所以如果想要正确使用数组应该要进行初始化。

2)数组如果部分初始化,那么没有初始化的元素是什么? 

对于数组来说,一旦有元素被初始化,其他元素都被赋值0

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {    
    //定义的同时进行初始化
    //1)全部初始化
    int a[3]={1,2,3};
    int a2[]={233,45,6};
    //部分初始化
    int a1[3]={1,23};
    int a4[10]={[3]=23,[8]=34};    
    //先定义数组,然后初始化
    int a5[4];  //定义了一个数组    
    //通过下标法进行初始化
    //数组长度是4   下标是数组的元素的编号
    // 0  1  2  3    
    a5[0] = 12;  //给第一个元素赋值12
    a5[1] = 34;  //给数组的第二个元素赋值34
    a5[2] = 1;
    a5[3] = 20;    
    //下面写法不允许
//    int len = 3;
//    int a6[len]={1,2,3};    
    return 0;
}<span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span></span>

六、一维数组的引用 

1、一维数组的引用方式 

数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。 下标表示了元素在数组中的顺序号。

数组元素访问一般形式为:  

数组名[下标]  

其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。 

例如: 

    a[5]
    a[i+j]
    a[i++]

都是合法的数组元素。 

数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使 用下标变量,而不能一次引用整个数组。  

2、一维数组的遍历 

一维数组的遍历:就是通过循环访问数组的每一个元素。

<span style="font-size:14px;">#include <stdio.h>
void test(){
    //定义了一个数组长度为3,可以存储3个int类型的数据
    int a[3];
    //等号的左侧必须是一个变量,所以a[0] 是一个变量
    //a[0] 代表的是数组的第一个空间
    //a[1]
    //下标:数组元素的编号,数组的编号从0开始
    //一个长度为n的数组,下标范围:0 ~ n-1
    //数组的引用(访问):数组名[下标] 就可以访问数组的元素    
    //如果要逐个访问数组的元素的话,这就叫数组的遍历
    a[0]=12;
    a[0]=23;    
    //特别强调:使用先定义后初始化的方式,如果部分数组元素被初始化了,
    //        系统不会对没有初始化的那部分元素进行赋值0的操作    
    printf("%d\n",a[0]);    
    //通过for循环,可以依次访问数组的每一个元素
    for (int i=0; i<3; i++) {
        printf("%d\t",a[i]);  //a[0]    a[1]    a[2]
    }
}
int main(int argc, const char * argv[]) {   
    //假设有数组int a[10]={1,2,3,4,5,6,7,8,9,10};
    //下标的范围:0 ~ 9
    int a[10]={1,2,3,4,5,6,7,8,9,10};    
    //1、正序输出 1 2 3 4 5 6 7 8 9 10
    for (int i=0; i<10; i++) {
        printf("%d\t",a[i]);
    }
    printf("\n");    
    //2、逆序输出数组的元素
    for(int i=9;i>=0;i--){
        printf("%d\t",a[i]);
    }    
    return 0;
}</span>

七、一维数组的存储方式 

1、数组的存储方式 

假设有数组如下:

int x[]={1,2};

char ca[5]={‘a’,‘A’,‘B’,‘C’,‘D’}; 

存储方式:

1)计算机会给数组分配一块连续的存储空间 

2)数组名代表数组的首地址,从首地址位置,依次存入数组的第1个、第2个....、第n个元素 

3)每个元素占用相同的字节数(取决于数组类型) 

4)并且数组中元素之间的地址是连续。  

模拟该数组的内存存储细节如下: 

int x[2]={1,2};

int ca[5]={'a','A','B','C','D'}; 

注意:字符在内存中是以对应ASCII值的二进制形式存储的,而非上表的形式。 在这个例子中,数组x的地址为它的首元素的地址0x08,数组ca的地址为0x03。


                                                                        -------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值