Day11 C基础(二维数组一维指针)

二维数组

二维数组遍历

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字节

总结:

  1. 32位操作系统:指针为4字节, 64位操作系统:指针为8字节
  2. 内存地址是固定的,但是变量的地址不固定的(栈区随机分配)
  3. 指针类型根据指针指向空间的数据类型

段错误

Segentation fault (core dumped
1)野指针,没有规定指向的指针会在内存中乱指,野指针产生原因
1.指针变量定义没赋值
2.指针 p 被 free 之后,没有置 NULL, 会让人以为p是合法指针
解决:int* p = NULL;

2)内存泄漏,对非法空间进行赋值

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值