您的位置:首页 > 编程语言 > C语言/C++

黑马程序员—IOS基础之C语言—数组与指针

2015-07-22 01:52 344 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

第一章 数组


一、一维数组

1、一维数组的定义

(1)数组:相同类型的若干个数组组成一个有序的集合
(2)一维数组:
数组的每个元素都是基本数据类型的变量
数组的每个元素都不是一个数组
(3)一维数组的定义
数组类型  数组名[数组长度]
(4)一维数组的定义的注意事项:


#include <stdio.h>
#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 <stdio.h>
#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]
;
//数组长度
4000
可以使用宏定义
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培训、期待与您交流! ——
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 数组 c语言