昨日回顾
if...else
数组:不允许越界访问。
练习:
1.在数组中插入一个数据。
2.寻找素数并保存到数组中。
3.将数组倒置。
===================
一、数组
(1)二维数组
** 行数可以省略,列数不可省。**
二、指针
(1)指针类型是一种特殊类型
Datatype *name; //一般使用形式。
Datatype* name; //底层代码使用较多。
Datatype * name;
*:表示这是一个指针变量。
name: 指针变量名。
指针和普通变量的区别:
指针 :存地址。
普通变量:存值。
指针只能保存与其相同类型的地址。
int *p:只能保存int型地址。
char *pc:只能保存char型地址。
double *pd:只能保存double型地址。
(2)初始化
例:
int *p= Null; //OK
int a=3;
int *pa= &a; //OK
int *pb;
pb= &a; //OK
int *pc;
*pc= &a; //不允许!!
(3)地址的访问
*:间接访问运算符。
如:
int a = 10;
int *pb;
pb = &a; //OK
例:
变量名 变量地址 值
a 0x000012 10
pb 0x000089 0x000012
*pb:取指针对应内存里的值。
(4)可把指针变量赋值给同类型指针。
(5)不同类型的指针大小
32位机下指针大小为4。
64位机下指针大小为8。
(6)指针的类型和指针所指向的类型
例:
int *pa;
int* pa;
double *pb;
指针的类型:去掉变量名之后的部分,int。
指针所指向的类型:去掉指针变量名和其前面的,int。
(7)指针与数组
数组名是个地址。
数组元素的访问:
int arr[5] = {0,1,2,3,4};
int *p =arr;
例:
arr[0]; arr[3];
*(arr); *(arr+3);
*(p); *(p+3); //数组名也可以理解为一个指针
p[0]; p[3];
(8)野指针
未初始化,或其指向的内存被释放,而指针没有被置空;
危害:造成系统资源的浪费,容易造成未知的致命错误。
常见,段错误
(9)指针地址的运算
指针的自增和自减
自增:向指针的高地址方向移动。
自减:向指针的低地址方向移动。
指针可互减,负号代表方向,表示两指针之间的距离,低地址与高地址间的字节的距离。
指针相加没有意义。
常量值×sizeof(对应数据类型)个字节!
(10)概念区分
例:
int buf[3]; //数组,大小为3,存放三个int型变量。
int *pa; //指针,其类型为int *型。
int *arr[3]; //指针数组;优先级看arr先和[]结合。数组里存着3个指针或地址。
int *(pa)[3]; //数组指针,又称行指针;指针里存数组的地址。
int (*)[3] pa; //上式的另一种形式,更好理解,数据类型定义一个变量。
又例:
int arr[3][3] = {{11,12,13},{21,22,23}.{31,32,33}};
<===> arr[3] = {arr[3](1),arr[3](2),arr[3](3)}
矩阵为
11 12 13
21 22 23
31 32 33
三、二级指针
格式
Datatype **PointorName;
例:
int a = 10;
int *q = &a;
int **p = &q;
注:
*p = q;
**p = *q = a;
定义一个指针,或对地址进行操作时,一定要确定指针的指向。
排版耗时25分钟。
疑问上课已提出,并解决。
网友评论