目录

1.指针定义

2.野指针

3.指针运算

3.1指针+/-整数

//利用指针自增自减访问数组

3.2指针相减

//利用指针相减求字符串长度

3.3指针的关系运算

//利用指针比较将数组arr中的元素逆序排放

4.二级指针

5.指针存储


1.指针定义

1. 指针是内存中一个最小单元的编号,也就是地址;

2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量;
3.为了便于移植源程序到其他计算机上运行,C语言禁止直接将一个地址值赋给一个指针变量(如 int *  p = 0x00112233)。
指针的大小在 32 位平台是 4 个字节,在 64 位平台是8个字节(占用)。

指针类型的意义:

1.指针类型决定了指针进行解引用操作的时候一次性访问几个字节,即访问权限;

2.char* 解引用访问1个字节,int* 解引用访问4个字节(访问)。

3.指针类型决定指针的步长(指针 + 1 跳过几个字节),char 跳过1个字节,int 跳过4个字节

注意,地址可以用标准%p打印,也可以用%x(以十六进制整数)打印,只是精度不同。

2.野指针

成因:局部变量指针未初始化,默认为随机值;指针越界访问(变成野指针);指针指向的空间释放。规避:指针初始化;小心指针越界;指针指向空间释放(放NULL); 避免返回局部变量的地址;指针使用之前检查有效性。

不知道怎么初始化时,可以 初始化为NULL,是一种状态标记,这是专门用来初始化指针的。
int main()
{int* p = 0;int* p = NULL;char* p = "";char* p = NULL;
}

3.指针运算

3.1指针+/-整数

//利用指针自增自减访问数组

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[10];int i = 0;int* p = arr;printf("请输入十个整数:");for (i = 0; i < 10; i++, p++){scanf("%d", p);}printf("逆序打印为:");p--;//这一步不能漏!!!for (i=0;i<10;i++,p--){printf("%d ", *p);}return 0;
}

3.2指针相减

指针-指针:两个指针类型相同,两个指针要指向同一块空间,得到的是两个指针之间的元素个数。

指针之间不能进行加法运算。

//利用指针相减求字符串长度

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{char arr[20];printf("请输入一个字符串:");gets(arr);char* str, * ptr;str = arr;//str先为arr起始地址,后变为最后一个元素之后的地址ptr = arr;//ptr为arr起始地址while (*str){str++;}int sz = str - ptr;printf("字符串的长度为:%d\n", sz);return 0;

3.3指针的关系运算

比较指针大小(即地址高低),结果是逻辑值

标准:后可前不可

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

利用指针比较可以更加便捷地访问数组:

int main()
{int arr[10];int* p = arr;for (p = arr; p < arr + 10; p++)//!!!{scanf("%d", p);}for (p = arr; p < arr + 10; p++)//!!!{printf("%d ", *p);}return 0;
}

//利用指针比较将数组arr中的元素逆序排放

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[10];int* p = arr;printf("请输入十个整数:");for (p = arr; p < arr + 10; p++){scanf("%d", p);}printf("逆序后的数组为:");for (p--; p >= arr ; p--){printf("%d ", *p);}return 0;
}

注意注意,上面这种方法只是逆着打印数组,原数组中的元素没有发生变化,若是想让数组元素本质改变,可通过交换元素实现,详见以下代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[10];int* p = arr;printf("请输入十个整数:");for (p = arr; p < arr + 10; p++){scanf("%d", p);}int* begin = arr;int* end = --p;int tmp = 0; for (; begin < end; begin++, end--){                  //改为 int* tmp = NULL后写成这样无法逆序tmp = *begin;  //tmp = begin;*begin = *end; //begin = end;*end = tmp;    //end = tmp;}printf("逆序后的数组为:");for (p = arr; p < arr + 10; p++){printf("%d ", *p);}return 0;
}

4.二级指针

指针前面的第一颗* 表示它是指针,其他所有表示指针指向对象的类型。

二级指针用来指向一级指针指向的地址 。

二维数组名是二级指针常量

int main()
{int a = 10;int* pa = &a;//pa是一级指针变量int** ppa = &pa;//ppa是二级指针变量int*** pppa = &ppa;//pppa是三级指针变量//…………**ppa = 50;printf("%d\n", **ppa);printf("%d\n", a);return 0;
}

5.指针存储

大端字节序存储

小端字节序存储——倒着放(一个数内部,不是整个数组),当前我们用的是小端

VS2019查看内存:调试——窗口——内存——任选其一

求下三种代码运行结果:

​​​

要想解决这些问题,我们首先要知道指针在内存中是怎么存储的。

就拿第一题为例,具体解析见下图:

答案:0 0 3 4 5

再来看第二题:

答案:6,12

最后第三题:

答案:0x 11 22 33 00


11.24 emmm……这篇博客写的有点急,可能不是很详细,还望各位见谅(为什么你们都要放假了我还在准备期中考试啊呜呜呜QAQ),有Bug请指正哦,谢谢~~~

12.2 补充了很多知识,还有一部分放在指针初阶(2)里了,应该很细致了哈,还是那句话,有错请指正!!

【C语言】指针Pointer初阶(1)相关推荐

  1. 一文带你深入浅出C语言指针(初阶)

    目录

  2. 【C语言】指针终结者-初阶

    目录 前言 一.指针是什么 1.内存 1)一个内存单元的大小是多大 2)如何给内存单元编号 2.指针变量 总结 二.指针和指针类型 1.指针类型 2.指针类型的意义 1)解引用操作 2)指针+-整数 ...

  3. 史上最强C语言教程----指针(初阶)

    目录 1.指针是什么? 2. 指针和指针类型 2.1 指针+-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针+-整数 4.2 指针- ...

  4. 【明解C语言】之指针初阶详解

    目录 一.指针是什么 二.指针和指针类型 1. 指针+-整数 2. 指针的解引用 3.练习 三.野指针 1.野指针成因 2.规避野指针的有效方法 四.指针运算 1.指针+-整数 2.指针-指针 3.指 ...

  5. C语言初阶(18) | 数组详解

    目录 1.数组的定义 2.一维数组 2.1一维数组的格式 2.2一维数组的初始化 2.3一维数组的使用 2.4一维数组再内存中的存储 3.二维数组 3.1二维数组的创建和初始化 3.2二维数组的使用 ...

  6. [C语言] 平淡的日子里泛起光 初阶最后的战役

    //细节讲一下操作符 //1.算术操作符 #include<stdio.h> int main() {//float number = 6 / 5;// 结果是1:系统自动认为整数相除// ...

  7. C语言初阶——5.字符串

    C语言初阶--5.字符串 1. 字符串操作 1.1 字符串遍历 可以通过数组方式遍历字符串. char* str="Hello World"; for(int i = 0;'\0' ...

  8. 五十分钟带你看遍C语言初阶语法(总纲)

    C语言初阶语法(总纲) 此篇博客包含了前面C语言所有的基础语法,写这一期的博客不仅是为了记录自己的学习成果也是为了让更多的朋友能学到对自己有用的知识,如果总有一个知识点帮助到了你,给卑微博主点点关注加 ...

  9. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

最新文章

  1. Linux下怎么诊断网站性能异常
  2. [BZOJ2144]国家集训队 跳跳棋
  3. Brocade说:网络就是云
  4. python函数调用语句_Python函数定义和函数调用
  5. 三星s8android pie,三星更改Galaxy S8的Android Pie更新计划,添加Gala
  6. (238)数字IC工程师核心技能树(一)
  7. python的整除运算_Python3基础 ** 幂运算 // 整除运算
  8. 车型车系品牌api离线版 CarApi
  9. 订单操作-订单详情查询代码实现
  10. python加mysql加界面用代码写_python加mysql_python操作mysql
  11. 深入剖析虚拟内存工作原理
  12. 053试题 334/682 - crosscheck
  13. 编程求一个9位的整数,数字由1-9构成,每个数字只能出现一次。并且这个整数的前一位能被1整除,前两位能被2整除, ......以此类推,前九位能被9整除。
  14. JSP及MVC三层架构
  15. JAVA添加水印,平铺和斜对角线我都有!
  16. oracle数据库有触发器,Oracle数据库触发器(Triggers)
  17. python自动翻译pdf_在Python中自动执行PDF
  18. Leetcode刷题——栈与队列
  19. 【安全资讯】个人信息保护新规将出台 消费者被短信轰炸将成为历史
  20. 氰化物工作室的游戏Cthulhu,或最终获得VR支持

热门文章

  1. 江苏秦淮河清淤工程每天捞出五六吨漂浮物
  2. 国内哪家的香港云服务器哪家好?
  3. 多线程爬虫实战--彼岸图网壁纸爬取
  4. zabbix邮件报警接入,微信报警接入
  5. fastdfs启动tracker启动不起来也不报错
  6. 各个数据库中,查询前n条记录的方法
  7. Hibernate实例--注解配置表映射
  8. iPhone或iPad如何在App Store(苹果应用商店)下载不同国家地区(如美区)的app
  9. Android Studio 快捷键--MAC版详解
  10. freemarker 字符串格式化