指针和内存单元

指针: 地址。内存单元: 计算机中内存最小的存储单位。——内存单元。大小一个字节。 每一个内存单元都有一个唯一的编号(数)。称这个内存单元的编号为 “地址”。指针变量:存地址的变量。

指针定义和使用:

int a = 10;int *p = &a;            int* p;--- windows; int *p ---Linux       int * p ;int a, *p, *q, b;*p = 250;          指针的 解引用。 间接引用。*p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。如果做左值: 存数据到空间中。如果做右值: 取出空间中的内容。任意“指针”类型大小:指针的大小与类型 无关。 只与当前使用的平台架构有关。   32位:4字节。   64位: 8字节。
using namespace std;
int main() {int a=10;int *p = &a;printf("指针地址%d\n",p);printf("存指针地址:%d\n",&p);printf("解引用:%d\n",*p);printf("a的地址%d\n",&a);return 0;
}

野指针:
1) 没有一个有效的地址空间的指针。

 int *p;*p = 1000;2)p变量有一个值,但该值不是可访问的内存区域。int *p = 10;*p = 2000;【杜绝野指针】

空指针:
int *p = NULL; #define NULL ((void *)0)

*p 时 p所对应的存储空间一定是一个 无效的访问区域。

万能指针/泛型指针(void *):

可以接收任意一种变量地址。但是,在使用【必须】借助“强转”具体化数据类型。char ch = 'R';void *p;  // 万能指针、泛型指针p = &ch;printf("%c\n", *(char *)p);

const关键字:

修饰变量:const int a = 20;int *p = &a;*p = 650;printf("%d\n", a);修饰指针:
const int *p;可以修改 p不可以修改 *p。
int const *p;同上。
int * const p;可以修改 *p不可以修改 p。
const int *const p;不可以修改 p。不可以修改 *p。
总结:const 向右修饰,被修饰的部分即为只读。
常用:在函数形参内,用来限制指针所对应的内存空间为只读。

指针和数组:

数组名:  【数组名是地址常量】 --- 不可以被赋值。   ++ / -- / += / -= / %= / /=  (带有副作用的运算符)指针是变量。可以用数组名给指针赋值。 ++ -- 取数组元素:int arr[] = {1,3, 5, 7, 8};int *p = arr;  arr[i] == *(arr+0) == p[0] == *(p+0)指针和数组区别:1. 指针是变量。数组名为常量。2. sizeof(指针) ===》 4字节 / 8字节sizeof(数组) ===》 数组的实际字节数。指针++ 操作数组:int arr[] = { 1, 2, 4, 5, 6, 7, 8, 9, 0 };int *p = arr;      for (size_t i = 0; i < n; i++){printf("%d ", *p);p++;  // p = p+1;   一次加过一个int大小。 一个元素。}p的值会随着循环不断变化。打印结束后,p指向一块无效地址空间(野指针)。

指针加减运算:
数据类型对指针的作用:

 1)间接引用:决定了从指针存储的地址开始,向后读取的字节数。  (与指针本身存储空间无关。)2)加减运算:决定了指针进行 +1/-1 操作向后加过的 字节数。
指针 * / % : error!!!
指针 +- 整数:1) 普通指针变量+-整数char *p; 打印 p 、 p+1  偏过 1 字节。short*p; 打印 p 、 p+1  偏过 2 字节。int  *p; 打印 p 、 p+1  偏过 4 字节。       2)在数组中+- 整数short arr[] = {1, 3, 5, 8};int *p = arr;p+3;          // 向右(后)偏过 3 个元素p-2;            // 向前(左)偏过 2 个元素3)&数组名 + 1加过一个 数组的大小(数组元素个数 x sizeof(数组元素类型))
指针 +- 指针:指针 + 指针: error!!!指针 - 指针:1) 普通变量来说, 语法允许。无实际意义。【了解】2) 数组来说:偏移过的元素个数。
#include <iostream>
using namespace std;
int main() {int a[]= {3,2};int *p = a;printf("指针地址%d\n",p);printf("存指针地址:%d\n",&(p));printf("解引用:%d\n",*p);printf("a的地址%d\n",&a);printf("存指针地址:%d\n",*(p+1));return 0;
}

指针实现 strlen 函数:
char str[] = “hello”;
char *p = str;
while (*p != ‘\0’)
{
p++;
}
p-str; 即为 数组有效元素的个数。
指针比较运算:

1) 普通变量来说, 语法允许。无实际意义。
2) 数组来说:  地址之间可以进行比较大小。可以得到,元素存储的先后顺序。
3) int *p;p = NULL;     // 这两行等价于: int *p = NULL;if (p != NULL)printf(" p is not NULL");else printf(" p is NULL");

指针数组:
一个存储地址的数组。数组内部所有元素都是地址。
1)
int a = 10;
int b = 20;
int c = 30;

 int *arr[] = {&a, &b, &c}; // 数组元素为 整型变量 地址
2) int a[] = { 10 };int b[] = { 20 };int c[] = { 30 };int *arr[] = { a, b, c }; // 数组元素为 数组 地址。 指针数组本质,是一个二级指针。二维数组, 也是一个二级指针。

多级指针:
int a = 0;

int *p = &a;                一级指针是 变量的地址。int **pp = &p;             二级指针是 一级指针的地址。int ***ppp = &pp;            三级指针是 二级指针的地址。  int ****pppp = &ppp;           四级指针是 三级指针的地址。  【了解】

多级指针,不能  跳跃定义!
对应关系:
ppp == &pp;           三级指针
*ppp == pp == &p;           二级指针
**ppp == *pp == p == &a               一级指针
***ppp == **pp == *p == a             普通整型变量
*p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。如果做左值: 存数据到空间中。如果做右值: 取出空间中的内容。

===================================================================================================================================
指针和函数:
传值和传址:
指针做函数参数:
数组做函数参数:
指针做函数返回值:
数组做函数返回值:

C语言从入门到精通——指针基础相关推荐

  1. 清华大学出版——C语言从入门到精通(第4版)

    <C语言从入门到精通(第4版)>是清华大学出版社出版的图书,该书从初学者的角度出发,以通俗易懂的语言,丰富多彩的实例,详细介绍了使用C语言进行程序开发需要掌握的各方面知识. <C语言 ...

  2. python从入门到精通清华_java从入门到精通(第5版)+python从入门到精通+c语言从入门到精通 全3册 清华大学出版社...

    <JAVA从入门到精通(第5版)> <Java从入门到精通(第5版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识 ...

  3. C 语言从入门到精通教程(2021 )

    C 语言从入门到精通教程(2021年) 文章目录 计算机常识 什么是计算机程序 ? 什么是计算机语言 ? 常见的计算机语言类型有哪些 ? 什么是C语言? C语言历史 C语言标准 C语言现状 为什么要学 ...

  4. 【带你上手云原生体系】第二部分:Go语言从入门到精通

    [带你上手云原生体系]第一部分:文章简介 及 云原生思维概览 [带你上手云原生体系]第二部分:Go语言从入门到精通 [带你上手云原生体系]第三部分:Docker从入门到精通 [带你上手云原生体系]第四 ...

  5. c语言从入门到精通第四版电子书_C语言从入门到精通(吐血分享)4.pdf

    C语言从入门到精通(吐血分享)4 成功! 结构体.链表.文件 数组.字符串 函数.指针 三种结构化程序设计 三种数据类型.六大表达式 一.简单的程序 #include 数学函数 命令行 main() ...

  6. oracle入门语,Oracle SQL 语言从入门到精通

    Oracle SQL 语言从入门到精通 作者:网络 佚名 2005-10-27 00:00 评论 分享 [IT168 服务器学院]数据库对象包括表.视图.索引.同义词.簇.触发器.函数.过程.包.数据 ...

  7. 【C语言】C语言从入门到精通|第1章 C语言概述—自学笔记

    前言 本篇是本人自学C语言过程进行编辑的文章笔记,如果对大家有用,点赞加收藏吧. 注:笔记基于<C语言从入门到精通(第3版)>明日科技编著,清华大学出版社出版的. 目录 一.C语言发展史 ...

  8. 视频教程-R语言从入门到精通系列之新手上路视频课程-其他

    R语言从入门到精通系列之新手上路视频课程 WOT峰会讲师,中国R语言大会讲师,数据分析师,8年以上数据挖掘建模工作实战经验,部分研究成果获国家专利,攥写<R语言与数据挖掘>.<数据先 ...

  9. GO语言从入门到精通全套教程

    GO语言从入门到精通全套教程 本套教程分为两部分:包括Go编程基础和Go Web基础.从GO语言基础知识的讲解到后面的实战开发,让您快速掌握GO语言编程技术.教程画质高清. 下载地址: 百度网盘 请输 ...

最新文章

  1. python 获取集合里面的某一个元素
  2. python numba jit 的效率
  3. linux cron读哪个文件,linux crontab 文件位置和日志位置
  4. Windows 下直接运行 Linux的Live CD版的方法
  5. SAP 产品 UI 里的容器组件的概念和开发概述
  6. html 圆球的百分比,HTML5 很酷的球形器皿中水波状的进度条
  7. java 批量验证_正则表达式批量验证函数
  8. 线程调度及进程调度详解
  9. 如何解决金山词霸与卡巴斯基的冲突问题
  10. 高项 案例分析重点知识 风险采购合同
  11. linux rm f命令,Linux 系统的常用命令之 rm ,rm -rf , rm -f 以及rm 命令的其他参数命令...
  12. 【其它笔记】驾考科目四笔记
  13. 蓝牙怎么调声音大小_苹果蓝牙耳机
  14. python中str.format用法_详解Python中的str.format方法
  15. 万国觉醒信号进爆满服务器,游漫谈:《万国觉醒》冷知识,玩家纷纷联盟,千人同屏硬刚服务器...
  16. JdbcTemplate的增删改查用法
  17. STM32+华为云IOT制作酒驾监控系统:上车就监控
  18. Java输出一个数组
  19. 网络爬虫学习第一弹:urllib库使用
  20. 超全文化艺术海外PPT模板素材网站整理

热门文章

  1. 如何获取 ChatGPT OpenAI API Key
  2. php生成gif1009php生成gif,怎样将几张图片做成会动的GIF的动态图像?GIF动画制作软件,将图片制作成GIF动图...
  3. Python | 图片转文字
  4. 怎样在微信公众号发文件?
  5. 稿定科技内推|稿定让设计更简单,只要你来,稿定就能给你无限可能
  6. 个人微信公众号——定位策略
  7. SpringBoot 统一功能处理
  8. 第19篇:WEB漏洞~SQL注入~SqlMap绕过WAF
  9. 广告公司给客户做的视频如何避免被外泄?
  10. 数据中台初探与应用实践,28页ppt详解