黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记

概述:

8_2、改变整型变量的符号

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

8_3、char类型数据存储

8_4、数组的基本概念及分类

8_5、数组元素作为函数参数

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

8_6、一维数组初始化

8_7、一维数组一个让人疑惑的问题

8_8、一维数组的引用

8_9、应用:数组遍历

8_10、一维数组的存储方式

8_11、一维数组的地址

8_12、一维数组长度计算方法

8_13、一维数组的越界问题

8_14、应用:找最大值

8_15、数组元素作为函数参数

8_16、数组名作为函数参数

8_17、数组名作为函数参数的注意点

8_17、数组名作为函数参数的注意点-补充

8_18、冒泡排序的思想

8_18、冒泡排序的思想-补充

8_19、冒泡排序代码实现

整形变量修饰符介绍(修饰符包括: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);

表示的范围是:

10000000 00000000 00000000 00000000 -->最小的负数   -2147483648

01111111 11111111 11111111 11111111 -->最大的正数    2147483647

long       8个字节   输出用%ld    -->占有八个字节

例如:long int c=1;

long int c1=c<<63;    //左移63位

c1=(c<<63)-1;

printf("c1 = ld%\n",c1);

表示的范围是:

10000000 00000000 00000000 00000000 ... 00000000 (共64位)  -->最小的负数   -9223372036854775808

01111111 11111111 11111111 11111111 ... 11111111 (共64位)  -->最大的正数    9223372036854775807

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);

}

11)数组名作为函数参数

a、用数组元素作为函数参数不要求形参也必须是数组元素,但是用数组名作为函数参数时,则要求形参和相对应的实参都必须是类型相同的数组。

b、在C语言中,数组名除作为变量的标示符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作为函数参数时,实参与形参之间不是“值传递”,而是“地址传递”,实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。

c、在变量作为函数参数时,所进行的值传递是单向的。即只能从实参传向形参,不能从形参传回实参。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。

12)数组名作为函数参数的注意点

a、形参数组和实参数组的类型必须一致,否则将引起错误;

b、形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽然不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应该注意的。

c、在函数形参表中,允许不给出形参的长度,或用一个变量来表示数组元素的个数。例如,可以写为:

void nzp(int a[])   或者写为:  void nzp(int a[],int n)

其中行参数组a没有给出长度,而由n值动态地表示数组的长度。n的值由主调函数的实参进行传递。

d、多维数组也可以作为函数的参数。在函数定义时对行参数组可以指定每一维的长度,也可以省去第一维的长度。因此,下面写法都是合法的:

int MA(int a[3][10])      或者:  int MA(int a[][10])

13)数组名作为函数参数的注意点

a、C语言中规定,不管是什么类型的数据,数据的内存地址在内存中占用8个字节

14)冒泡排序思想

冒泡排序(Bubble sort)是一种简单的排序算法。

冒泡排序分为:

a、大数下沉

b、小数上浮

冒泡排序步骤:

a、比较相邻的元素。如果第一个比第二个大,就交换他们的位置。

b、对每一对相邻的元素做同样的工作,从开始第一对到结尾最后一对。在这一点,最后的元素应该会是最大的数。

c、针对所有的元素重复以上的步骤,除了最后一个。

d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数组需要比较。

代码实现:

void maoPao(int nums[],int len){

int temp;

for(int i=0;i<len-1;i++){

for(int j=0;j<len-1-i;j++){

if(nums[j]<nums[j+1]){

temp=nums[j];

nums[j]=nums[j+1];

nums[j+1]=temp;

}

}

}

}

void main(){

int nums[10]={1,5,2,7,6,9,3,4,15,74};

printf("排序前:");

for(int i=0;i<10;i++){

printf("%d\t",nums[i]);

}

maoPao(nums,10);

printf("排序后:");

for(int i=0;i<10;i++){

printf("%d\t",nums[i]);

}

}

时间: 2024-08-04 18:23:41

黑马程序员--IOS学习笔记--数组及排序的相关文章

黑马程序员--IOS学习笔记--IOS初级视频目录

1.第一天: 1.1.开发概述 1.2.IOS设备发展史 1.3.Mac OS X系统介绍 1.4.Mac OS X常见设置 1.5.Mac OS X系统操作(一) 1.6.Mac OS X系统操作(一) 1.7.Mac OS X系统操作(一) 1.8.开发环境Xcode安装.使用 1.9.IOS开发体验之按钮.界面切换 1.10.IOS开发体验之按钮.界面切换(补充) 1.11.IOS开发体验之打电话发短信 1.12.IOS开发体验之<Tom猫> 1.13.计算机程序 1.14.IOS开发基

黑马程序员——Foundation学习笔记(NSSet和NSMutableSet)

==========android培训.ios培训.java培训.期待与您交流========== 一.NSSet: NSSet NSSet里面存储的元素没有顺序,NSArray中的元素有顺序. NSSet *s = [NSSet set]; // 创建一个空的Set,永远是空,不可变. NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose",nil]; NSString *str = [s2 anyObject]; //

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

黑马程序员-C学习笔记之scanf

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.scanf函数介绍 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include<stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量. 函数原型为:int scanf(const char*format,...); 二.scanf用

黑马程序员-OC学习笔记之Foundatio框架集合类

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.OC数组 OC数组是一个类,它也分不可变数组NSArray和可变数组NSMutableArray. 1?不可变数组的创建 // 创建一个不可变数组,元素为一个OC字符串对象 @"小桥" NSArray *array1 = [NSArray arrayWithObject:@"小桥"]; // 创建一个不可变数组,元素为多个O

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员-OC学习笔记之ARC

---------------------- IOS开发.Android培训.期待与您交流! ----------------------一.什么是ARC        ARC是自动引用计数,苹果官方在Xcode4.2及以后版本中加入的一个内存管理机制,完全取代了程序员人工的内存管理,使得程序员只须关心程序本身.使用ARC,编译器会自动在代码中加入内存管理代码,是一个编译器特性,而不是运行时特性,当然,它也和JAVA的垃圾回收不同,它的本质和手动的内存管理是一样的,只是这些代码编译器会自动添加.

黑马程序员-C学习笔记之预处理指令

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.什么是预处理指令 预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包含,条件编译. 预处理指令一般以 # 号开头,可以出现在文件的任何地方,作用于整个文件. 二.宏定义 宏定义分不带参数的和带参数的宏定义.     1?不带参数的宏定义 #import <stdio.h> #define AGE 10 // 宏名用大写 int ma

黑马程序员-OC学习笔记之NSString与NSMutableString

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSString与NSMutableString 相信大家对NSString类都不陌生,它是OC中提供的字符串类,它的对象中的字符串都是不可变的,而它的子类NSMutableString类的对象中的字符串就是可变的.什么是可变与不可变呢?二者的区别就是在已经创建的一个字符串对象中,在程序中能不能更改字符串,比如拼接新的字符串,可变的可以在原字符串中更改,