文章目录
二维数组
二维数组遍历
for循环嵌套,外层行数,内层是列数
int arr[m][n] = {};
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
// 可以输入也可以输出
scanf() / printf()
}
}
指针
指针的优点:
1.使程序更加简洁、紧凑、高效
2.有效的表达更复杂的数据结构
3.动态分配内存
4.得到多于一个数的函数返回值
1.概念:
地址:内存中每个字节单元都有的编号
指针:指针就是地址
指针变量:用于存放地址的变量叫做指针变量
2.格式:
存储类型 数据类型* 指针变量名
int* p;
使用:
int a = 5;
int* p = &a;
char ch = ‘t’;
char* p = &ch;
3.指针操作符
&:取地址符:取变量的地址
*:取内容:取地址里面的内容
*&a == a; // *和&是互逆运算
// a是变量就是错的,a是地址就是对的
&*a
4.初始化
指针变量在使用前不仅要定义还要初始化,未初始化的指针变量是不能随便使用的,会产生野指针
将普通变量的地址赋值给指针变量
int a = 10;
1)int* p = &a; // 定义的同时赋值
2)int* p = NULL; // 先定义指针变量在进行赋值
p = &a;
将数组的首地址赋值给指针变量
char str[10] = “hello”;
char* p = str; // 指针指向数组的首地址,指向字符 ‘h’ 的地址
将指针变量里面保存的地址赋值给另一个指针变量
float f = 1.3;
float* p = &f;
float* q = p;
5.指针运算
5.1 算数运算
char str[32] = “hello”;
char* p = str;
p++; // 指针向高地址方向移动一个数据单位,指针指向发生变化
p–: // 指针向低地址方向移动一个数据单位,指针指向发生变化
int* p; p++; // 移动4字节
double* p; p++; // 移动8字节
p+n:访问高地址方向第 n 个数据的地址,指针指向不会发生变化
p-n: 访问低地址方向第 n 个数据的地址,指针指向不会发生变化
偏移了多少地址(字节) = n * sizeof(数据类型)
两个地址之间的差 = 两个地址之间相隔元素的个数
q - p = 之间相隔的元素个数
char str[] = “hello”;
char* p = str;
char* q = p+3;
printf(“%d\n”, q - p);
5.2 关系运算
< == !=
指针之间的关系运算比较的是它指向地址的高低
高地址的指针大于低地址的指针
注意:指向不同类型的数组指针关系运算没有意义,指向不同区域的指针关系运算也没有意义
(同一个数组间进行比较)
指针的大小
int a = 5;
int* p = &a; // 4
short b = 2;
short* p1 = &b; // 4
double c = 1.1;
double* p2 = &c; // 4
szieof(指针变量名)
32位操作系统:指针为4字节
8位16进制表示,4字节
64位操作系统:指针为8字节
16位16进制表示,8字节
总结:
- 32位操作系统:指针为4字节, 64位操作系统:指针为8字节
- 内存地址是固定的,但是变量的地址不固定的(栈区随机分配)
- 指针类型根据指针指向空间的数据类型
段错误
Segentation fault (core dumped
1)野指针,没有规定指向的指针会在内存中乱指,野指针产生原因
1.指针变量定义没赋值
2.指针 p 被 free 之后,没有置 NULL, 会让人以为p是合法指针
解决:int* p = NULL;
2)内存泄漏,对非法空间进行赋值