指针和内存单元

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

指针定义和使用:

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. yolov3 pytorch错误集合
  2. 查找算法:二分查找、顺序查找
  3. scss 文件里的特殊符号 @ 和 @include 的用法
  4. zoeDylan.js框架-数据底层
  5. ImportError: No module named 'matplotlib'(python 安装各种 )
  6. linux中如何快速进入某个目录
  7. Vue.$nextTick
  8. Angular在FormGroup中使用ngModel失效报错问题的解决办法
  9. ctypealpha php_PHP Ctype函数(转)
  10. Logrotate操作手册
  11. unity player 显示播放错误时的解决办法
  12. day31 模块 与包
  13. 2022秋软工实践个人作业一
  14. Electron技术架构
  15. 需求变更对软件质量的影响
  16. 苹果官网首页页面设计
  17. c语言报告实验反思,c语言实验总结与反思
  18. Cube(给出八个点,判断这八个点是否可以构成一个正方体)
  19. 使用阿里云的【身份证实名认证接口】API核验用户的真实性
  20. Pymoo:优化算法收敛性的实例分析

热门文章

  1. 结构化数据和非结构化数据的分析
  2. Tecno(传音)手机在非洲市场占有率高达40%,成功原因是?
  3. 求函数:x的n次方(函数递归)
  4. Pattern Recognition期刊投稿经验
  5. 秒杀脚本丨Python淘宝或京东等秒杀抢购脚本实现
  6. [转载]受 Windows XP SP2 影响的软件列表
  7. 如何防止你的爬虫被网管一巴掌拍死
  8. 南京邮电大学-数据结构-慕课MOOC-第四章作业
  9. 免费且非常实用的PPT模板网站(免费)亲测可用!!
  10. 资料外泄:给系统管理者的警告