IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 关于c语言中指针问题 -> 正文阅读

[C++知识库]关于c语言中指针问题

前言

个人觉得c语言学的是内存,而不是代码,当你在c语言中搞清楚这些,就为将来打下基础。

内存四区

1.代码区 : 存放代码。
2.全局区 : 全局的常量 ···· 例:字符串常量“abc” ···· static和auto的定义的全局变量。
3. 栈区 : 系统自动开辟,系统自动释放。(开辟的空间并不是很大)
4. 堆区 :动态开辟的内存,手动开辟,手动释放。(一般特大的)

一般情况下(32位)

  • char ········· 1字节
  • short ········ 2字节
  • int ············ 4字节
  • long ········· 4字节
  • float ·········· 4字节
  • double ······ 8字节

地址

把内存以单个字节为单位,分开对每一个字节编号,这个编号就是地址。

  1. 编号是连续的。
  2. 唯一的。

首地址

一段内存空间中第一个存储单元的地址


int a;
在这里插入图片描述

不难看出a占了四个字节,它的首地址就是100

-------------------------------------------------------------------------------------------------------------------------------------------------------

int a[5];
在这里插入图片描述

而数组a的首地址是a[0]的地址100

int a[3][3];
在这里插入图片描述

这个二维数组的首地址是a[0][0]

指针变量

  • 用来存放地址的变量
  • 内存大小为4B(根据操作系统定)

int *p;
定义一个指针变量p,存的是地址!!
int指明指针指向的数据类型
*指明 p这个变量是一个指针变量

注意
int *p;与 * p
这两个是不一样的
定义指针变量的时候 int *p; *只是表明p是一个指针变量。
而在非定义的时候 *p,则表示为 取值运算符

&取地址运算符(单目运算符)
*取值运算符。返回某一个地址中的指(单目运算符)

野指针

不能明确指向的指针变量。(危险)
int *p;中的p保存的地址是随机的,一不小心刚好随机到重要数据就没了。
处理int *p = NULL;

指针变量的运算
自加加,自减减,加,减。

指针偏移,去访问地址旁边的一些内存。
指针变量的加减,以指针所指向的类型空间单位进行偏移。

char *p; // char    1   p+1   偏移1字节
int *p1;// int      4   p1+1   偏移4字节
double *p2;// double  8 p2+1   偏移8字节

一维数组与指针

记得创建数组的时候记得初始化

  1. 定义一个一维数组,数组名是这个数组的 首地址
    int a[5];
    a指向 a[0], a 的类型就是 int*
    &a 这个地址指向整个数组 &a的类型 int(*)[5];
	int *a;
    printf("a = %d\n", a);
    printf("a+1 = %d\n", a+1);
    printf("&a = %d\n", &a);
    printf("&a+1 = %d\n", &a+1);

结果为
在这里插入图片描述
访问方式

  1. 下标法
  2. 指针法
  • 其中指针法里又可以有 *(p+i)和 *p++
  • 两者是不一样的,前者p的值始终保持不变,后者p的值运算一次就变一次
    3 .数组名法
    但是数组名a不可以*a++ ,因为数组名不能够随意改,会报错。
    a=a+1 == a++

二维数组与指针

例:

int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 , 12 };

数组名:a
a是二维数组的首地址
a指向二维数组的第一个存储单元,也就是a[0];
在这里插入图片描述
a指向a[0] 这个一维数组的,a的类型是int ( )[4];
所以a + 1 = a[1]; +16个字节。
a[0]指向a[0][0];
a[0]的类型是int

所以a[0] + 1 = a[0][0]; +4字节;
不要看它们的地址,要看类型,它们的地址都是一样的。
int  a[3][4] = { 1,  2, 3, 4, 5, 6, 7, 8, 9, 10, 11 , 12 };


    printf("a = %d\n", a);   //二维数组首地址
    printf("a[0] = %d\n ", a[0]);  //二维数组首地址

    printf("&a[0][0] = %d \n", &a[0][0]);  //一维数组首地址

    printf("\n");

    printf("a + 1 = %d\n", a + 1);  //二维数组首地址
    printf("a[1] = %d\n ", a[1]);  //二维数组首地址

    printf("&a[0][1] = %d \n", &a[0][1]);  //一维数组首地址

在这里插入图片描述
查找m行n列的元素:
a[m][n];
*(a[m]+n);
((a+m)+n);

int a[3][4];

名称类型
&aint(*)[3][4]
aint(*)[4]
a[0]int*
a[0][0]int

结语

c语言是面向过程,通过指针我们就可以让c语言面向对象

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:01:53  更:2021-07-27 16:02:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 4:25:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码