IOS学习笔记--整形变量修饰符介绍
整形变量修饰符介绍(修饰符包括:int short long 【long long】 signed unsigned)
1、改变整形变量所占存储空间
short 2个字节 输出用%hd short int a=4;-->占有两个字节 printf("%hd\n",变量名);
例如:short int a=1;
short int a1=a<<15; //让a左移15位,最小的负数
a1=(a<<15)-1; //左移15位,最大的正数
printf("d%\n",a1);
short 修饰的int占两个字节,共占16位
表示的范围是:
10000000 00000000 -->最小的负数 -32768
01111111 11111111 -->最大的正数 32767
int 4个字节 输出用%d 或者 %i -->占有四个字节
例如:int b=1;
int b1=b<<31;
b1=(b<<31)-1; //左移31位
printf("d%\n",b1);
long 8个字节 输出用%ld -->占有八个字节
例如:long int c=1;
long int c1=c<<63; //左移63位
c1=(c<<63)-1;
printf("c1 = ld%\n",c1);
long long 8个字节 输出用lld%(主要是为了解决32位机器问题)-->占有八个字节
注意:所有修饰符都是用来修饰整形变量的。
* long long类型
在32位系统下:
long 占4个字节(改变整形变量的存储空间)
long long 占8个字节
在64位系统下:
long 占8个字节
long long 占8个字节
2、改变整形变量的符号
signed 表示是有符号的(计算机默认是有符号的)
unsigned 表示是一个无符号的数(改变整形变量的符号,正数的取值范围会扩大一倍。) 输出用u% printf("u%\n",变量名);
3、char类型数据存储
1)char 型常量的存储问题
sizeof('a')
-->先找到'a'的ASCII码值 -->97
-->把 97 按照int类型进行 -->00000000 00000000 00000000 01100001
char ch='a'
-->97
-->把97转换为 2 进制 01100001 一个字节
-->把一个字节存储到内存中
总结:char类型的常量和变量的存储方式是不一样的。(注:在Xcode环境下。如果在其他环境下可能一样)
一个字节的范围:0--127 用做常见的字符的ASCII码
4、数组的基本概念以及分类
1)基本概念:
在程序设计中,为了数据处理方便,我们把具有相同类型的若干变量按照有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。
在 C 语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本类型或者是构造类型。
2)数组的几个名词:
什么是数组:一组具有相同数据类型的数据的有序集合。
数组元素:构成数组的数据。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,所以也称为下标变量。
数组的下标:就是数组元素的位置的一个索引或指示。
数组的维数:就是数组下标的个数。数据数组的维数可以将数组分为一维数组、二维数组、三维数组、多维数组。
按存储的内容分类:按数组元素的类型不同,数组又分为:
数值数组:用来存储数组
字符数组:用来存储字符
指针数组:用来存放指针(地址)
结构数组:用来存放一个结构体类型的数据
按照维度分类:
一维数组:
二维数组:
三维数组:
多维数组:
5、数组元素作为函数参数
1)数组可以作为函数的参数使用,进行数据的传递。
a、一种是把数组元素(下标变量)作为实参使用;
数组元素就是下标变量,它与普通变量并没有区别。因此它作为函数实参使用与普通变量时完全相同的,在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传递。
b、一种是把数组名作为函数的形参和实参使用。
6、一维数组的定义以及注意事项
1)一维数组的介绍:
如果一个数组的所有元素都是基本数据类型,那么该数组称为一维数组
2)一维数组的定义
在C语言中使用数组必须先进行定义。一维数组的定义方式:
类型说明符 数组名[常量表达式]
a、类型说明符:是任一种基本数据类型或构造数据类型。
b、数组名:用户定义的数组标示符。
c、方括号中的常量表达式:表示数据元素的个数,也称为数组的长度。
例如:int a[10]; //定义整形数组a,有10个元素
float b[10],c[20]; //定义实型数组b,有10个元素,定义实型数组c,有20个元素。
注意:a、数组的长度可以是一个常量,也可以是常量表达式。
b、数组的命名规则:严格按照标示符的命名规范。
c、数组名称不能和其他变量同名。
d、数组的长度不可以为一个变量(C99标准要求的)
e、数组的长度可以使用 宏定义(#define M 5 int a[M] -->此时M是一个宏定义)
f、定义数组的时候,还可以定义普通变量。(如:int x,y,z[9];)
3)一维数组的初始化:
数组初始化赋值是指在数组定义时给数组赋予初值。数组初始化是在编译阶段进行的。这将减少运行时间,提高效率。
初始化方式有两种:
a、定义的同时初始化
例如:
类型说明符 数组名[常量表达式]={值1,值2,值3...值n};
实例:int a[3]={1,4,2}; //长度由[]中的值决定的
int b[]={2,5,7,6}; //长度是由{}中的值的个数决定的
int c[10]={[3]=23,[8]=34};//定义长度为10的数组,下标为3的元素的值为23,下标为8的数组元素为34
b、先定义、后初始化
类型说明符 数组名[常量表达式];
数组名[0]=值;
数组名[1]=值;
数组名[2]=值;
实例:int d[10];
d[0]=1;//为下标为0的数组元素赋值为1;即数组的第一个元素值为1;
d[1]=2;//为下标为1的数组元素赋值为2;即数组的第二个元素值为2;
d[2]=3;//为下标为2的数组元素赋值为3;即数组的第三个元素值为3;
...
d[9]=100;//为下标为9的数组元素赋值为100;即数组的第十个元素值为100;
4)一维数组中让人疑惑的问题:
数组如果没有初始化,数组中到底有没有值?如果有,值是多少?如果数组部分进行了初始化,那么没有初始化的那些元素有没有值,如果有,值是多少?
a、数组如果没有初始化,数组中的元素是有值的。值是垃圾值。
b、如果数组部分进行了初始化,那么没有初始化的那些元素有值,如果有,值是0。
c、如果是字符数组进行了部分初始化,那么没有初始化的部分也有值,值为ASCII码对应的默认值。
5)一维数组的引用方式
数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方式是数组名后跟一个下标。下标表示了元素在数组中的顺序号。
特别强调:使用先定义后初始化的方式,如果部分数组元素被初始化了,系统不会对没有初始化的那部分元素进行赋值0的操作。
6)一维数组的存储方式
存储方式:
a、计算机会给数组分配一块连续的存储空间;
b、数组名代表数组的首地址,从首地址位置,依次存入数组的第一个、第二个、...、第n个元素;
c、每个元素占用相同的字节数(取决于数据类型)
d、并且元素之间的地址是连续的。
7)一维数组的地址
一维数组的地址:
a、数组内部的元素地址是连续的;
b、数组名存放的是数组的首地址-->数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节的地址)
c、补充:数组名==&数组名[0]; 数组名是一个常量 存储的就是数组的首地址
d、数组的每个元素的地址
8)一维数组长度计算方法
a、因为数组在内存中占用的字符数取决于其存储的数据类型和数据个数
b、数组在内存中占用的总字节数:sizeof(数组名);
c、计算数组长度的方法:
数组的长度=数组占用的总字节数/数组元素占用的字节数
例如:int a[]={1,5,3,2,7,4,9,23,46,47,36};
int a_len=sizeof(a)/sizeof(int);
9)一维数组的越界问题
数组下标越界是不安全的,因为这个空间不属于你。可能会有数据丢失现象发生。
10)应用:找最大值
//通过for循环,从键盘获取10个数,存放到数组中。找出10个数中的最大值
void main(){
int a[10];
//循环接收用户输入
for(int i=0;i<10;i++){
printf("请输入第%d个数\n",i+1);
//接收数据,保存到数组中
scanf("%d",&a[i]]);
}
//遍历数组,输出看看输入的10个值
for(int i=0;i<10;i++){
printf("%d\t",a[i]);
}
//找出最大值
int max=a[0];
for(int i=0;i<10;i++){
if(max<a[i]){
max=a[i];
}
}
printf("输入的最大值为:%d\n",max);
}
|
|