——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
第一章 数组
一、一维数组
1、一维数组的定义
(1)数组:相同类型的若干个数组组成一个有序的集合
(2)一维数组:
数组的每个元素都是基本数据类型的变量
数组的每个元素都不是一个数组
(3)一维数组的定义
数组类型 数组名[数组长度]
(4)一维数组的定义的注意事项:
#include
#define M 4
int main(int argc, const char * argv[]) {
//注意事项
//(1)数组的长度是可以是一个常量 也可以是常量表达式
int b1[1+1]; //3+3是常量表达式
//(2)数组名的命名规则:严格按照标识符的命名规范
//(3)数组名不能和其他变量同名
int b2; //这是一个整型变量
int b2[4];//定义了一个整型数组,和整型变量同名了
//(4)数组的长度不可以为一个变量
int len =4;
int b3[len]; //这是我们xcode编译器做的优化放到c++编译器就报错
//(5)数组的长度可以使用 宏定义
int b4[M]; //M是一个宏定义
//(6)定义数组的时候,还可以定义普通变量
int m,n,b5[4]; //定义两个整形变量 m,n,又定义了一个长度为4 数组名为a7的数组
return 0;
}
2、一维数组的初始化
初始化就是给定义的变量赋值。
初始化的方法
// 1)定义的同时进行初始化
// 格式:
// 数据类型 数组名[长度]={值1,值2,...};
// (1)定义的同时完全初始化
//定义了一个长度为3的数组,数组名是b,给数组的每一个元素进行赋值
int b[3]={1,2,3};
//定义个一个数组,数组名是b1,数组的长度根据后面大括号中赋值的个数来决定的(此处大括号中有3个值,所以数组长度是3)
int b1[]={233,45,6};
(2)定义的同时进行部分初始化
//定义了一个长度为3的数组,数组名是b2,给数组的元素进行赋值
//第一种方法
int b2[3]={6,8};
//第二种方法:定义一个长度为10的数组,数组名是b3,
//[4] 表示下标为4的元素赋初值1
//[6] 表示下标为6的元素赋初值2
int b3[8]={[4]=1,[6]=2};
// 2)先定义数组,然后在初始化
int b4[4]; //定义了一个数组
//通过下标法进行初始化,数组长度是4
//下标是数组的元素的编号
// 0 1 2 3
//依次赋值
a4[0] = 1;
a4[1] = 3;
a4[2] = 5;
a4[3] = 7;
3、一维数组的一些问题
一维数组的初始值的问题:
(1)若未进行初始化,那么一维数组中存放的是垃圾值
(2)若只进行了部分初始化,那么其他数组元素的值为0
(3)使用先定义后初始化的方式,如果部分数组元素被初始化了,系统不会对没有初始化的那部分元素进行赋值0的操作
一维数组的访问:
数组的引用(访问):数组名[下标] 就可以访问数组的元素
数组的地址问题:
数组名是一个常量 存储的就是数组的首地址,数组名代表了数组的首地址也是数组的第一个元素的地址
一维数组长度计算:
运用sizeof函数计算
二、二维数组
1、二位数组的定义
二维数组:
可以看做是一个特殊的一维数组 ,这个一维数组的每个元素又是一个一维数组
二维数组的定义
数据类型 数组名[第一维的长度(行)][第二维的长度(列)];
int a[2][3];
理解方法:
1)这是一个特殊的一维数组,一维数组有两个元素 a[0] a[1]
a[0] 它又存放了一个长度为3的一维数组
2)定义了一个2行3列的一个矩阵
#include
#define M 3
int main(int argc, const char * argv[]) {
//定义一个二维数组
int a[2][3];
//注意事项数组名不能和变量名同名
int b;
int b[2][3];
//数组的长度可以是常量表达式
int c[2][1+3];
//注意这种写法,其他的编译器可能不支持,xcode特有的
int m=3,n =3;
int arr[m][n];
//数组长度可以使用宏定义
int arr2[3+M][2];
return 0;
}
2、二维数组的初始化
//二维数组的初始化
//1)定义的同时初始化
//(1)完全初始化
int a1[2]={1,2};
//1、特殊的一维数组,第一维有2个元素
int a[2][3]={{12,23,45},{1,2,3}}; //分段
//2、连续赋值
int a[2][3]={1,2,3,4,5,6};
//3、可以省略第一维
//int a[3][3]
int a[][3]={{1,2,3},{3,4,5},{3,4,5}};
//int a[4][2]
int a[][2]={1,2,3,4,5,6,7,8};
//(2)部分初始化
//一般情况下我们用于给数组初始化为0
int a[3][4]={1};
int a[3][4]={{1},{2},{3}};
//注意:这种写法第一维长度可以省略
int a[3][4]={1,2,3,4,5};
//2)先定义,后初始化
int a[3][4];
//第一维下标:0 1 2
//第二维下标:0 1 2 3
a[0][0] = 1;
3、二维数组中的一些问题
二维数组的遍历
二维数组的遍历通过数组下标来访问。
二维数组的存储细节
int a[3][3]
数组的首地址 = 数组名a = &a[0] = &a[0][0]
第二章 指针
一、基本指针
1、指针变量的定义
(1)指针变量
用来存放地址的变量,就是指针变量
(2)指针的实质
就是地址
(3)指针变量的定义
数据类型 *指针变量名;
//定义了一个指针变量,变量名是p
//int表示,p只能存放一个int类型的变量的地址
int *p;
//定义了一个指针变量,变量名是p1
//p1只能存放一个char类型数变量的地址
char *p1;
//警告,这是不对的
int num=10;
(4)指针变量定义的注意事项
1)“*” 必须得有,如果没有就相当于定义一个普通变量
2)指针变量能用来存放数值或者字符之类的吗? 不能
3)指针变量,归根结底还是变量,也有全局和局部变量之分
2、指针变量的初始化和引用
(1)指针变量也是变量
指针变量的使用: 定义指针变量 ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)。
(2)指针变量如果不初始化会有什么后果?
结论:如果一个指针变量定义以后,如果不进行初始化,这个指针变量存放的事一个垃圾数,这个指针变量,称之为野指针。
一定要避免操作野指针,因为可能会带来意向不到的错误值是一垃圾值,有可能存放是系统程序的地址,可能会造成系统崩溃。
(3)"*" 的两种用法
1) 用于定义一个指针变量
2) 存储指针变量指向的存储空间的内容
//指针变量如何进行初始化,指针变量应该用地址初始化
//1、定义的同时进行初始化
// 1)完全初始化
//用a的地址初始化 p这个指针变量
//另外一种描述方法:p指向了a
int *p = &a;
//p1 p2都指向了a
int *p1 = &a,*p2 = &a;
// 2)部分初始化
//定义了两个指针变量 p3 p4
int *p3 = &b,*p4;
p4 = &b;
//2)先定义后初始化
int *p7;
//空指针
p7 = NULL;
//3)如果定义了一个指针变量,但是我不知道让这个指针指向谁
//NULL 是空(0)
int *p5 = NULL;
//空
int *p6 = 0;
指针的一些问题
指针的应用场景:
1)在被函数中可以修改主调函数中的变量的值
2)让函数可以有多个返回值
二级指针:
指针存放的是另外一个指针的地址,一般形式,**p。
指针为什么要区分类型
因为指针存放的是地址,每一种数据类型的占用的内存字节数都不一样,所以要区分类型。
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——