C语言学习笔记(六)—— 指针

不同类型的指针的区别:

  1. 访问的范围不同,int*的指针访问4个字节,char*的指针访问1个字节,数组的指针除外(*数组指针) == 数组首元素地址;
  2. +1跳过的跨度不同,会跳过整个访问范围,数组指针+1也跳过整个数组;

一、野指针

野指针:指针指向的位置是不可知的;(随机值、不正确)

//1、指针未初始化
int* p;

//2、指针越界
int arr[10] = {0};
int* p = &arr;
p += 11;  // 此时p越界为野指针 

//3、指针指向的空间已经被释放
int test()
{
int a = 10;
return &a;
}

二、指针计算

2.1 指针和整数
*(arr + i) == arr[i] == *(i + arr) == i[arr];
2.2 指针和指针
int main()
{
int arr[10] = {0};
printf{"%d ", &arr[9] - &arr[0]};  // 打印结果是:9
printf{"%d ", &arr[0] - &arr[9];  // 打印结果是:-9
return 0;
}

注意:指针和指针相减的前提是两个指针指向同一空间,不然无意义;

2.3 指针关系运算

标准:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的内存位置的指针比较。

#define NUMS 10
int arr[NUMS] = {0};
int* ptr = NULL;
for(ptr = &arr[NUMS-1], ptr >= &arr[0], ptr--)
{
*ptr = ptr;
}  // 该代码最后将数组前一个位置内存的指针和&arr[0]做了比较,不符合标准

for(ptr = &arr[NUMS], ptr > &arr[0], )
{
*--ptr = ptr;
}  // 此代码符合标准

三、二级指针

int a = 10;
int* ptr1 = &a;  // 一级指针
int** ptr2 = &ptr1;  // 二级指针:用来存放一级指针变量的地址
**ptr2 = 100;  // 此时修改了a的值

char arr1[] = "aaaa";
char arr2[] = "bbbb";
char arr3[] = "cccc";
char* ptr[] = {arr1, arr2, arr3};  // 指针数组
char**ptr2 = ptr;  // 二级指针

// 访问
// ptr[1][2] == arr2[2] == 'b';
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值