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

文章目录

  • 二维数组
    • 二维数组遍历
  • 指针
    • 1.概念:
    • 2.格式:
    • 3.指针操作符
    • 4.初始化
      • 将普通变量的地址赋值给指针变量
      • 将数组的首地址赋值给指针变量
      • 将指针变量里面保存的地址赋值给另一个指针变量
    • 5.指针运算
      • 5.1 算数运算
      • 5.2 关系运算
    • 指针的大小
  • 段错误

二维数组

二维数组遍历

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)内存泄漏,对非法空间进行赋值

你可能感兴趣的:(华清远见培训,c语言)