指针(一) 基础

一 指针的概念

  1. 为了方便访问内存中的内容,给每个内存单元一个编号,我们称这个编号为地址,及为指针.
  2. 指针也是一种数据类型 所以指针都有自己的内存 存储的是地址(编号)

指针的四要素

  1. 指针本身的类型 除去指针名,剩下的就是指针本身的类型
  2. 指针指向的类型 除去指针名和一个*,剩下的就是指针指向的类型
  3. 指针本身的内存 用来存储一个编号(4字节)
  4. 指针指向的内存 可以是各种类型
    int num = 0;          // 类型: intint arr[10] = {};     // 类型: int [10]int* MuShan = {1,2,3};//去掉名字,剩下的就是类型

二 指针的定义

1 运算符

*: 定义时,表示定义的是一个指针 其他的时候表示解析引用

&: 取地址符(用于取地址)

2 定义

指针的定义有多种理解方式;

  1. 类型 变量名;
int* p; // 类型: int// 变量名: *p
  1. 指针本身类型 指针名;
int* p; // 指针本身的类型: int*// 指针名: p
  1. 指针指向的类型* 指针名;
int* p; // 指针指向的类型: int// 指针名: p

反推:

  1. 除去指针名,剩下的就是指针本身的类型
  2. 除去指针名和一个*,剩下的就是指针指向的类型
int****** p1; // p1本身的类型: int****** // p1指向的类型: int*****  (6级指针可以指向5级指针)

三 指针的内存

  1. 所有的指针,无论类型,在内存中都占4个字节的内存(存的是地址)(具体和64/32位环境相关)
#include <stdio.h>
int main()
{char*       pch;short*      psh;int*        pn;float*      pf;double*     pd;printf("%d\n", sizeof(pch));  // 4printf("%d\n", sizeof(psh));  // 4printf("%d\n", sizeof(pn));   // 4printf("%d\n", sizeof(pf));   // 4printf("%d\n", sizeof(pd));   // 4return 0;
}
  1. 指向起始地址
int num = 10;
int* p = &num;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-naQJWXaU-1644340436740)(C:\Users\admin\Desktop\六星教育\学习\指针\指针(一)]\指针基础(一)1-1.png)

四 指针的初始化与赋值

1 用对应类型变量的地址

 int num = 10;int* pn = &num;   //初始化float f = 3.14f;float* pf;pf = &f;          //赋值

2 用相同类型的指针

 int num = 10;int* pn = &num;     // 初始值int* p1 = pn;       // 初始化int* p2;p2 = pn;            // 赋值

3 直接用地址

 int* p = (int*)0x36;

4 用数组名

一级指针可以接受一堆一位数组的数组名

 int arr[5] = { 1,2,3,4,5 };int* p = arr;

5 字符串

#include <stdio.h>
int main()
{// 数组名就是数组的首地址char arr[5] = { 'a','b','c' };char* p = arr;printf("%s\n",p);     //输出:abcchar str[5] = "abcd";p = str;printf("%s\n", str);  //输出:abcdprintf("%s\n", p);    //输出:abcd// ==> char*类型的指针可以直接用来打印整个字符串到'\0'停止const char* p1;p1 = "1234";printf("%s\n",p1);    //输出:1234const char* p2 = "Mushan";printf("%s\n",p2);    //输出:Mushanreturn 0;
}

6 置空

 int* p = NULL;int* p1 = (int*)0x0;
/*NULL: #define NULL  00地址有时候,指针定义好了,但是暂时没有指向或者是,指针用完了,没有指向了指针不知道指向哪里(会随机指向)此时的指针,很危险(野指针)所以 这些情况下的指针统一安排一个地址给他们指向指向0地址
*/

7 多级指针

#include<stdio.h>int main() {int num = 10;printf(" num = %d\n", num);        //   num = 10;printf("&num = %X\n", &num);       //  &num = 10FFA78int* p = &num;printf("*p = %d\n", *p);           //  *p = 10 (num值)printf(" p = %X\n", p);            //   p = 10FFA78 (num的地址)printf("&p = %X\n", &p);           //  &p = 10FFA6Cint** pp = &p; // 一个二级指针printf("**pp = %d\n", **pp);       // **pp = 10 (num值)printf(" *pp = %X\n", *pp);        //  *pp = 10FFA78 (num的地址)printf(" pp = %X\n", pp);          //   pp = 10FFA6C (p的地址)printf(" &pp = %X\n", &pp);        //  &pp = 10FFA60 int*** ppp = &pp; // 一个三级指针printf("***ppp = %d\n", ***ppp);   // ***ppp = 10 (num值)printf(" **ppp = %X\n", **ppp);    //  **ppp = 10FFA78 (num地址)printf(" *ppp = %X\n", *ppp);      //   *ppp = 10FFA6C (p的地址)printf("  ppp = %X\n", ppp);       //    ppp = 10FFA60 (pp的地址)printf(" &ppp = %X\n", &ppp);      //   &ppp = 10FFA54return 0;
}

五 指针的加减法

核心:指针本身的值(指向)没有变化

指针偏移

  1. 指针可以加上或减去一个整数

  2. 指针加上或减去一个整数后,实际上是进行了偏移

  3. 偏移的范围是加上或减去的整数个单位

    单位: 指针指向的类型在内存中所占字节数

    偏移:指针指向不变,但是可以根据偏移量取内容

#include <stdio.h>
int main()
{int num = 10;int* p = &num;printf("%X\n", p);          // EFFB5Cprintf("%X\n", p + 1);      // EFFB60return 0;
}

六 指针的自增自减

自增自减,会改变指针指向

++:表示指针向后移动一个单位

– :表示指针向前移动一个单位

单位:指针指向的类型在内存所占内存中所占的字节数

#include <stdio.h>
int main()
{int num = 10;int* p = &num;printf("%X\n", p);          // EFFB5Cprintf("%X\n", p + 1);      // EFFB60printf("%d\n",*p);          // 10printf("%X\n", p += 1);     // EFFB60printf("%d\n",*p);          // -858993460(无意义)return 0;
}

七 通过指针遍历数组

遍历一维数组

#include <stdio.h>
int main()
{int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (size_t i = 0; i < 10; i++){printf("%2d", arr[i]);}printf("\n");int* p = arr;// p和arr,除了arr是一个常量之外,其他几乎是一样的for (size_t i = 0; i < 10; i++){printf("%2d", p[i]);}printf("\n");printf("%d\n", p[0]);        // 0printf("%d\n", *(p + 0));    // 0printf("%d\n", p[1]);        // 1(先偏移 后取值)printf("%d\n", *(p + 1));    // 1// p[n] <==> *(p+n)return 0;
}
// p[n]:叫做下标形式
// *(p+n):叫做指针偏移的形式

遍历二维数组

  1. 二维数组也是数组

  2. 二维数组可以看成元素是一维数组的一维数组

  3. 数组的内存是连续的

#include<stdio.h>int main()
{int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};for (size_t i = 0; i < 3; i++){for (size_t j = 0; j < 4; j++){printf("%3d", arr[i][j]);}printf("\n");}int* p0 = arr[0];int* p1 = arr[1];int* p2 = arr[2];printf("\n");// 1:for (size_t i = 0; i < 4; i++){printf("%3d", p0[i]);           // 1  2  3  4}printf("\n");for (int i = -4; i <= 7; i++){printf("%3d", p1[i]);           // 1  2  3  4  5  6  7  8  9 10 11 12}printf("\n");for (int i = 0; i < 12; i++){printf("%3d", arr[0][i]);       // 1  2  3  4  5  6  7  8  9 10 11 12}printf("\n");// 下标: 保证数组不越界即可// 2:int* p = &arr[0][0];for (int i = 0; i < 12; i++){printf("%3d", arr[0][i]);       // 1  2  3  4  5  6  7  8  9 10 11 12       }printf("\n");for (int i = 0; i < 12; i++){printf("%3d", *p);              // 1  2  3  4  5  6  7  8  9 10 11 12p++;}printf("\n");return 0;
}

【C语言】指针基础知识点汇总相关推荐

  1. C语言指针基础知识点(六)--通过指针引用多维数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  2. C语言指针基础知识点(四)--通过指针引用数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  3. C语言指针基础知识点(七)--通过指针引用字符串

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  4. C语言基础知识点汇总(一)

    C语言基础知识点汇总(一) 1.读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 2.程序中基本的控制结构是三种: 顺序结构 .选择 ...

  5. C语言基础知识点汇总(1)

    C语言基础知识点汇总(1) 1.读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 2.程序中基本的控制结构是三种: 顺序结构 .选择 ...

  6. java基础知识大全,java 基础知识点汇总

    java 基础知识点汇总 问题一:我声明了什么! String s = "Hello world!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个Strin ...

  7. 计算机基础知识点文库,计算机基础知识点汇总.doc

    计算机基础知识点汇总.doc (19页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 一-.基础操作1. 在中文Windows中,使用软键 ...

  8. Python零基础入门,纯干货!【Python基础知识点汇总整理】

    目录 第一章 认识Python.Python常用集成开发环境PyCharm 一.认识 Python 01. Python 的起源 1.2 Python 的设计目标 1.3 Python 的设计哲学 0 ...

  9. C语言指针(基础篇)

    文章目录 前言 一.指针与地址 1. 变量与内存 2. 地址与指针 3. 常量.变量.内存.地址.指针的关系 二.指针的基础操作 1.大端模式与小端模式 2. 指针的定义与初始化 2.1 指针的定义与 ...

最新文章

  1. 追溯Ceres-Solver中CostFunction类方法
  2. springBoot探索(2)——构建手脚架
  3. datatables 基本增删改查(php)
  4. C#如何去掉字符串中所有空格
  5. 【手把手带你入门深度学习之150行代码的汉字识别系统】学习笔记 ·002 训练神经网络
  6. 关于C#关闭窗体后,依旧有后台进程在运行的解决方法
  7. Ubuntu系统下go语言环境的搭建
  8. gbdt 和random forest 效果非常好的思考!
  9. 移动html5 滑动 zepto,移动端使用zepto编写的滑动事件
  10. Unity使用tolua框架教程: LuaFramewrk
  11. idea插件开发--组件--编程久坐提醒
  12. 采用RP2040 MCU的树莓派Pico迷你开发板介绍
  13. peewee mysql_Peewee、MySQL和INSERT忽略
  14. nginx 每秒万级并发优化
  15. Object,byte[],ByteBuffer之间的转换。
  16. mysql---分库分表
  17. Flex布局——flex-basis、flex-grow、flex-shrink
  18. 易语言复制代码到记事本时出现乱码
  19. SpringMVC的执行流程
  20. C小程序-将输入的数字转换成大写汉字

热门文章

  1. 电商3.0 属于粉丝经济的时代!
  2. LeetCode 826 Most Profit Assigning Work
  3. 4.3 移位寄存器的实现和应用
  4. SRAM的工作原理图解
  5. c语言采用文件存储数据,C语言读写文件大全 之 基础篇
  6. sqli-labs Less-38、39、40、41、42、43、44、45(sqli-labs闯关指南 38、39、40、41、42、43、44、45)—堆叠注入
  7. 100部好看的校园喜剧片(可练习英文)+美国校园青春励志电影+25部口语练习电影+20部最浪漫电影
  8. 百度云有关Token
  9. 嵌入式期末大作业——家用智能晾衣杆
  10. Android获取移动网络信号强度