C语言从入门到精通——初阶6 指针
指针是什么
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
编号-地址-指针
指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针和指针类型
指针类型的大小都是一样的,指针类型作用:type *类型的指针是为了存放type类型的地址
4个二进制位可以表示1个十六进制位。 1个十六进制位换成4个二进制位。
指针类型的意义
- 指针类型决定了:指针解引用的权限有多大
- 指针类型决定了,指针走一步,能走多远(步长)
int main()
{
//2. 指针类型决定了,指针走一步,能走多远(步长)int arr[10] = { 0 };int *p = arr;char *pc = arr;printf("%p\n", p);printf("%p\n", p+1);printf("%p\n", pc);printf("%p\n", pc+1);//1. 指针类型决定了:指针解引用的权限有多大int a = 0x11223344;char* pc = &a;*pc = 0;int* pa = &a;*pa = 0;return 0;
}
整数数组中: 一个字节一个字节的访问:char *;一个元素一个元素去操作:int *
野指针
概念:指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
成因:1.指针未初始化 2.指针越界访问 3.指针指向的空间释放
如何避免野指针:
1.指针初始化2.小心指针越界3.指针指向空间释放即使置NULL4.指针使用之前检查有效性
int main()
{//当前不知道p应该初始化为什么地址的时候,直接初始化为NULLint* p = NULL;//明确知道初始化的值int a = 10;int* ptr = &a;//C语言本身是不会检查数据的越界行为的//指针使用之前检查有效性int* p = NULL;if(p != NULL)*p = 10;return 0;
}
指针运算
指针+-整数
指针-指针
指针-指针的前提:两个指针指向同一块空间
//指针-指针方法求字符串个数my_strlen()
//计数器
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}//递归
int my_strlen(char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);else return 0;
}//指针-指针
int my_strlen(char* str)
{char* start = str;while (*str != '\0'){str++;}return str - start;
}int main()
{//strlen(); - 求字符串长度int len = my_strlen("abc");printf("%d\n", len);return 0;
}
指针的关系运算
避免这样写,因为标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针比较。
指针和数组
数组名表示的是数组首元素的地址
可以直接通过指针来访问数组
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};int* p = arr;//数组名printf("%d\n", arr[2]);printf("%d\n", p[2]);//p[2] --> *(p+2)//[] 是一个操作符 2和arr是两个操作数//a+b//b+aprintf("%d\n", 2[arr]);printf("%d\n", arr[2]);//arr[2] --> *(arr+2)-->*(2+arr)-->2[arr]//arr[2] <==> *(arr+2) <==> *(p+2) <==> *(2+p) <==> *(2+arr) == 2[arr]//2[arr] <==> *(2+arr)return 0;
}
二级指针
int main()
{int a = 10;int* pa = &a;//pa是指针变量,一级指针//ppa就是一个二级指针变量int ** ppa = &pa;//pa也是个变量,&pa取出pa在内存中起始地址int*** pppa = &ppa;return 0;
}
指针数组
指针数组是数组。是存放指针的数组。
int* parr[5];//整形指针的数组char* pch[5];//字符指针的数组
P101 指针初阶等作业讲解
有符号整形和无符号整形运算时,把有符号整形看成无符号整形
-1的补码32个1,按照unsigned int读取成一个非常大的数
//求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和,其中a是一个数字
int main()
{//由a组成前n项之和 - 不考虑溢出int a = 0;int n = 0;scanf("%d %d", &a, &n);int i = 0;int sum = 0;int ret = 0;//一项的值for (i = 0; i < n; i++){//算出一项ret = ret * 10 + a;sum = sum + ret;}printf("sum = %d\n", sum);return 0;
}
//写一个函数,可以逆序一个字符串的内容
#include <assert.h>
#include <string.h>void reverse(char* str)
{assert(str);int len = strlen(str);char* left = str;char* right = str + len - 1;while (left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}int main()
{char arr[] = "abcdef";//fedcbareverse(arr);printf("%s\n", arr);return 0;
}
C语言从入门到精通——初阶6 指针相关推荐
- C语言从入门到精通第17天(指针和数组联用)
指针和数组联用 不同类型指针变量之间的区别 数组的指针 指针数组 不同类型指针变量之间的区别 在了解数组和指针联用之前,我们先对指针变量进行补充.我们对比一下int *p1和char *p2的区别? ...
- 清华大学出版——C语言从入门到精通(第4版)
<C语言从入门到精通(第4版)>是清华大学出版社出版的图书,该书从初学者的角度出发,以通俗易懂的语言,丰富多彩的实例,详细介绍了使用C语言进行程序开发需要掌握的各方面知识. <C语言 ...
- C 语言从入门到精通教程(2021 )
C 语言从入门到精通教程(2021年) 文章目录 计算机常识 什么是计算机程序 ? 什么是计算机语言 ? 常见的计算机语言类型有哪些 ? 什么是C语言? C语言历史 C语言标准 C语言现状 为什么要学 ...
- 视频教程-R语言从入门到精通系列之新手上路视频课程-其他
R语言从入门到精通系列之新手上路视频课程 WOT峰会讲师,中国R语言大会讲师,数据分析师,8年以上数据挖掘建模工作实战经验,部分研究成果获国家专利,攥写<R语言与数据挖掘>.<数据先 ...
- 3.2 Go语言从入门到精通:包管理工具之GOPATH
当我们真正用 Go 去做项目,或者阅读 Go 项目(如,Go 实现的开源项目)时,不可避免的会遇到包依赖问题,一些包管理方式总是很难区分.选择.Go的包管理与Java的Maven依赖管理不太一样,起初 ...
- c语言从入门到精通第四版电子书_C语言从入门到精通(吐血分享)4.pdf
C语言从入门到精通(吐血分享)4 成功! 结构体.链表.文件 数组.字符串 函数.指针 三种结构化程序设计 三种数据类型.六大表达式 一.简单的程序 #include 数学函数 命令行 main() ...
- c语言从入门到精通ppt,C语言从入门到精通第1章.ppt
C语言从入门到精通第1章 1.2.2 认识Turbo C 2.0 1.2.2 认识Turbo C 2.0 ⑴ 菜单栏:包括[File](文件)菜单.[Edit](编辑)菜单.[Run](运行)菜单.[ ...
- oracle入门语,Oracle SQL 语言从入门到精通
Oracle SQL 语言从入门到精通 作者:网络 佚名 2005-10-27 00:00 评论 分享 [IT168 服务器学院]数据库对象包括表.视图.索引.同义词.簇.触发器.函数.过程.包.数据 ...
- 【C语言】C语言从入门到精通|第1章 C语言概述—自学笔记
前言 本篇是本人自学C语言过程进行编辑的文章笔记,如果对大家有用,点赞加收藏吧. 注:笔记基于<C语言从入门到精通(第3版)>明日科技编著,清华大学出版社出版的. 目录 一.C语言发展史 ...
- python从入门到精通清华_java从入门到精通(第5版)+python从入门到精通+c语言从入门到精通 全3册 清华大学出版社...
<JAVA从入门到精通(第5版)> <Java从入门到精通(第5版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识 ...
最新文章
- 【vue】vue +element 搭建项目,Qs用途
- linux下修改ssh默认的连接端口及禁止root远程连接等
- SSL WS-Security--Web Service安全保障
- 试了下CommonLisp的WEB开发
- C语言从0到1·数据类型及其存储
- 一篇文章搞定面试中的二叉树题目(java实现)
- 信号量与令牌桶_限流的4种方式令牌桶实战
- 巧克力王国 BZOJ 2850
- AndroidMainfest.xml具体解释——lt;activitygt;
- 触发事件_黑暗的三天之触发事件
- MySQL 8.0中的JSON增强
- 一分钟,六张图让您看懂Linux系统对程序员的重要性。
- inx函数python_Python数据分析入门
- 鸿蒙OS应用开发_基础篇_编写第一个HarmonyOs应用_体会HarmonyOs的一次开发多端部署_以及分布式任务调度_IDE安装_了解应用组件以及应用布局---HarmonyOs开发工作笔记001
- C# 客服端上传文件与服务器器端接收 (简单代码)
- Spark 广播变量 TorrentBroadcast
- 安装SQL Server 2005中文开发版后,界面变英文改中文解决方法
- Android系统 miui主题,MIUI 主题完全折腾指南
- Tesseract调用日文识别模型
- 物联网轻松上云实践 之 HaaS样板间