#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】 指针入门的更多相关文章

  1. 郝斌老师C语言学习笔记(一)

    在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...

  2. [C]郝斌C语言课程大纲及笔记

    本笔记整理于郝斌老师C语言课程,做学习参考之用. 1.[编程笔记]第一章 C语言概述 2.[编程笔记]第二章 C语言预备知识 3.[编程笔记]第三章 运算符与表达式 4.[编程笔记]第四章 流程控制 ...

  3. 郝斌老师的SQL教程

    时隔两年,重拾数据库编程.郝斌老师的sql教程通俗易懂,用作复习简直不能太赞.

  4. C语言指针入门知识

    C语言指针往往是C语言学习过程中最困难的地方, 最近重新理解了一下C语言的指针知识, 在此整理一下, 如果有错误请留言指正. 对于刚入门的人来说, 指针涉及方方面面, 从简单的数组到结构体, 都会用到 ...

  5. android107 指针入门

    #include <stdio.h> #include <stdlib.h> //指针就是内存地址 //32为操作系统最大是4G内存,32为系统则是2的32次方, //所以只能 ...

  6. ST表入门学习poj3264 hdu5443 hdu5289 codeforces round #361 div2D

    ST算法介绍:[转自http://blog.csdn.net/insistgogo/article/details/9929103] 作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 方 ...

  7. 转载 c++指针 指针入门

    这是一篇我所见过的关于指针的最好的入门级文章,它可使初学者在很短的时间内掌握复杂的指针操作.虽然,现在的Java.C#等语言已经取消了指针,但作为一个C++程序员,指针的直接操作内存,在数据操作方面有 ...

  8. C语言指针入门

    指针指包含地址 声明指针: int num:声明整数 int *num:声明指针,下面的声明也是等价的,空格的使用指示个人爱好 int* num; int  *  num; int  *num; in ...

  9. C学习笔记(3)---作用域,数组, (少量指针入门)

    1. 作用域(scope):任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量. a. 在函数或块内部的局部变量 - 在某个函数或块的内 ...

  10. 郝斌–SQL Server2005学习笔记

    数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...

随机推荐

  1. dhcp报错

    报错详情 查看dhcpd.service状态 使用命令检查配置文件报错 dhcpd -t -cf /etc/dhcp/dhcpd.conf 修改配置文件 重启dhcpd服务 [root@servera ...

  2. Centos安装Redis(极速安装)

    下载 从官网找到下载文件,我下载的是redis-6.0.16.tar.gz. 安装 1. 解压文件 解压文件然后,进入解压文件夹: tar -zxvf redis-6.0.16.tar.gz cd r ...

  3. CF1838A-Blackboard-List

    题意简述 在黑板上有两个数字,进行如下操作 \(n-2\) 次: 每次在黑板上选择任意两个数,将两个数的差的绝对值写在黑板上. 这样你会得到一个长度为 \(n (3 \le n \le 100)\) ...

  4. 【Java面试题-基础知识02】Java抽象类和接口六连问?

    1.抽象类和接口分别是什么? 抽象类是一种类,可以包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,需要在子类中被具体实现. 接口是一种完全抽象的类,其中的所有方法都是抽象方法,没有方法体,它只 ...

  5. The solution of P5339

    problem 容斥好题,结果题解里面一堆 \(\text{NTT}\). 如果我们去掉有多少个人喜欢什么东西的条件,那么这个题就直接枚举有 \(i\) 组同学会一起讨论蔡徐坤.这一个问题十分容易. ...

  6. 微信支付(付款码支付,条码支付,刷卡支付)左上角LOGO显示

    微信支付(付款码支付,条码支付,刷卡支付)左上角LOGO显示 如果你上送的sub_appid 公众号(小程序),优先显示你公众号(小程序)的LOGO,如果你的公众号(小程序)未设置LOGO,会显示上游 ...

  7. idea为什么提示:Duplicated code fragment (**lines long)

    idea为什么提示:Duplicated code fragment (**lines long) 原因是有相同的代码块在类里,可以把这部分代码封装成一个方法,提高代码可读性.

  8. Exception:kylin构建cube, Cannot modify mapReduce.queue.name at runtime

    Failed to open new session: java.lang.IllegalArgumentException: Cannot modify tez.queue.name at runt ...

  9. 洛谷 P5595 歌唱比赛

    题目链接:歌唱比赛 思路 根据题目分析可得,假如小x的点赞数是123111,小y的点赞数是234111,则字符串的第4为到第6位结果都为Z,分别为对比(111,111),(11,11),(1,1),字 ...

  10. python 将查询到数据,处理成包含列名和数据的字典类型数据

    try: self.connect_dbserver() self.cursor.execute(sql) res = self.cursor.fetchall() # 返回的是数组的类型 print ...