【郝斌C ST】 指针入门
#include <stdio.h>
int main() {
printf("Hello, World!\n");
int i = 3;
int * p = &i;
printf("%d",*p);
return 0;
}
指针 = 指针变量类型 + 指针变量 + 同类型变量的地址赋值
说明
- int i = 3 声明了一个int类型的i变量,并赋值了3这个值
- int * p 声明了一个int指针类型 的 p指针变量,注意不是*p!!!, int * 表示这是一个int指针类型
- &i 表示取这个i变量的地址,变量的地址也是一个值
- int * p = &i 表示把 i变量的地址赋值给p指针变量【指针就是地址】
- *p 表示通过存放的&i地址访问i变量存储的值,也就是说 *p == i 这个意思
注意事项:
- 不要把i变量直接赋值给p,两者的类型就不一样,一个是int类型的变量,一个是int指针类型的变量
- 也不要把值直接赋值给p,原因同上
- 当&i赋值给了p,也就是说p保存了i的地址,因此,p指向了i
- 指针变量,是一个只能存放同类型的变量地址的地址变量
- 指针和地址是同样的一个涵义
- *指针变量 完全等同于 普通变量,所有 *p 的地方 都可以 替换 i,反之也可以
指针的用途:
- 表示复杂的数据结构
- 快速传递数据
- 函数的返回值可以返回多个值
- 直接访问硬件
- 方便的处理字符串
- 是理解面向对象语言的基础
总结:指针是C语言的灵魂所在!!
指针的定义:
- 什么是地址?
地址是内存单元的编号
从0开始的非负整数
范围:4G内存 230 * 22 = 4GB - 1
- 什么是指针?
指针就是地址,地址就是指针
指针变量就是存放内存单元编号的变量
指针和指针变量是两个不同的概念
指针的本质是一个操作受限的非负整数,可以相减操作,不可加乘除
错误类型示范:
#include <stdio.h>
int main() {
int * p ;
int i = 3;
*p = i;
printf("%d",*p);
return 0;
}
声明一个int指针类型变量p 但是,不为p赋值任何的变量地址,此时的p则是一个野指针,会指向内存中任意一个内存单元
*p = i 是把i变量的值 3 赋值给指针变量p所指向的未知内存单元变量,这个行为是非常危险的!!!
int main() {
int i = 3;
int * p;
int * q;
p = &i;
*q = p;
printf("%d",*q);
return 0;
}
- 声明int类型变量i并赋值3,声明int指针类型p和q
- p指针变量 指向 i变量的地址
- *q 指向 p指针变量,这是一个语法错误,*p能访问或者赋值的是一个int类型变量的值或者字面量,但是p是一个int指针类型,所以类型不匹配报错
- 如果改成 *q = *p ,这就回到上面的错误了,q指针变量又是一个野指针,指向一个未知的内存单元,并赋值i变量
- 如果改成 p = q, 那就是把q指针变量指向的未知内存单元,赋值给p指针变量,*q则会读取这个未知内存单位存放的值
自学视频《郝斌C语言自学教程》 121 - 126:
https://www.bilibili.com/video/BV1os411h77o
C指针形象动画视频:
https://www.bilibili.com/video/BV1MJ411D7EX
【郝斌C ST】 指针入门的更多相关文章
- 郝斌老师C语言学习笔记(一)
在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...
- [C]郝斌C语言课程大纲及笔记
本笔记整理于郝斌老师C语言课程,做学习参考之用. 1.[编程笔记]第一章 C语言概述 2.[编程笔记]第二章 C语言预备知识 3.[编程笔记]第三章 运算符与表达式 4.[编程笔记]第四章 流程控制 ...
- 郝斌老师的SQL教程
时隔两年,重拾数据库编程.郝斌老师的sql教程通俗易懂,用作复习简直不能太赞.
- C语言指针入门知识
C语言指针往往是C语言学习过程中最困难的地方, 最近重新理解了一下C语言的指针知识, 在此整理一下, 如果有错误请留言指正. 对于刚入门的人来说, 指针涉及方方面面, 从简单的数组到结构体, 都会用到 ...
- android107 指针入门
#include <stdio.h> #include <stdlib.h> //指针就是内存地址 //32为操作系统最大是4G内存,32为系统则是2的32次方, //所以只能 ...
- ST表入门学习poj3264 hdu5443 hdu5289 codeforces round #361 div2D
ST算法介绍:[转自http://blog.csdn.net/insistgogo/article/details/9929103] 作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 方 ...
- 转载 c++指针 指针入门
这是一篇我所见过的关于指针的最好的入门级文章,它可使初学者在很短的时间内掌握复杂的指针操作.虽然,现在的Java.C#等语言已经取消了指针,但作为一个C++程序员,指针的直接操作内存,在数据操作方面有 ...
- C语言指针入门
指针指包含地址 声明指针: int num:声明整数 int *num:声明指针,下面的声明也是等价的,空格的使用指示个人爱好 int* num; int * num; int *num; in ...
- C学习笔记(3)---作用域,数组, (少量指针入门)
1. 作用域(scope):任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量. a. 在函数或块内部的局部变量 - 在某个函数或块的内 ...
- 郝斌–SQL Server2005学习笔记
数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...
随机推荐
- NCNN的内存显存分配器ncnn::Allocator & ncnn::VkAllocator翻译及其差异对比的学习笔记(nihui亲审过滴)
NCNN的内存分配器 ncnn::Allocator 通用内存分配器 ncnn::PoolAllocator 内存池分配器 可以设置池大小,减少分配内存和析构内存次数,空间换时间 ncnn:: ...
- Chapter1 p1 Output Image
由于本文章是对TinyRenderer的模仿,所以并不打算引入外部库. 那么我们第一步需要解决的就是图形输出的问题,毕竟,如果连渲染的结果都看不到,那还叫什么Renderer嘛. 由于不引入外部库,所 ...
- jenkins结合远程仓库
既然是持续集成,对代码进行构建,我们得获取代码仓库的内容,这里选择我们搭建的gitlab服务器 1.开发工程师的机器 1. 在window上生成ssh-key $ ssh-keygen.exe -t ...
- 《Android开发卷——程序自动登录》
Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...
- java rabbitmq模拟生产者,消费者demo
1.exchange类型,rabbitmq交换机类型 exchange类型fanout 扇形交换机,它会把所有发送到该交换机的消息路由到所有与该交换机绑定的队列中.direct 直连交换机,它会把消息 ...
- Hibernate Validator 校验注解
Hibernate Validator 校验注解/** * 认识一些校验注解Hibernate Validator * * @NotNull 值不能为空 * @Null 值必须为空 * @Patter ...
- Lecture6
Smiling & Weeping ---- 我渴望你的在场,又渴望你的缺席,你终究是我深藏的借口 第六章 GitFlow工作流实战 6.0 引言 在实际项目开发工作中,常常会有自测.联调.提 ...
- Abp vNext 模块化系统简单介绍
怎么使用模块1. 建立模块直接的依赖关系,可以通过DependsOnAttribute特性来确定依赖关系2. 先配置模块,实现为模块填充数据和功能设置.3. 使用模块提供的功能接口 怎么定义模块1. ...
- HMS Core 6.2.0版本发布公告
新增动作捕捉能力.通过简单拍摄即可获得人体3D骨骼关键点数据,广泛应用于虚拟形象.体育运动和医学分析等场景: 3D物体建模能力iOS版本上线. 查看详情>> 新增道路吸附能力.可根据坐标点 ...
- python重拾第七天-面向对象进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...