鹏哥C语言77---指针的定义和类型

#define _CRT_SECURE_NO_WARNINGS

cpp 复制代码
#include <stdio.h>
#include <string.h>

//---------------------------------------------------BIT - 6 - 指针-------------------------------------------------

1.指针是什么

2.指针和指针类型

3.野指针

4.指针运算

5.指针和数组

6.二级指针

  1. 指针数组

//-------------------------------------------------------------------------------------------------1 指针是什么

1.指针是内存中一个最小单元的编号,也就是地址

2.平时口语中说的指针, 通常指的是指针变量, 是用来存放内存地址的变量

总结 : 指针就是地址, 。//指针变量:

我们可以通过& (取地址操作符)取出变量的内存 起始地址, 把地址可以存放到一个变量中, 这个变量就是指针变量

cpp 复制代码
int main()
{
    int a = 10; // a 是整型变量,占用4个字节的内存空间
    int* pa = &a; // pa 是一个指针变量,用来存放地址的,pa 的类型是 int*
    //本质上,指针就是地址
    //口语中说的指针通常指的是指针变量,指针变量是用来存放地址的一个变量

    return 0;
}

一个内存单元是 1 字节,1字节byte = 8比特位bit

在32位的机器上, 地址是32个0或者1组成二进制序列, 那地址就得用4个字节的空间来存储, 所以一个指针变量的大小就应该是4个字节。

那如果在64位机器上, 如果有64个地址线, 那一个指针变量的大小是8个字节, 才能存放一个地址。

指针变量是用来存放地址的, 地址是唯一标示一块地址空间的。

指针的大小在(X86)32位平台是4个字节, 在(X64)64位平台是8个字节。

//----------------------------------------------------------------------------------------- 2 指针和指针类型

cpp 复制代码
int main()
{
    char* pc = NULL;
    short* ps= NULL;
    int* pi= NULL;
    double* pd= NULL;
    //sizeof() 返回的值的类型是无符号整型 unsigned int
    printf("%zu\n", sizeof(pc)); //8
    printf("%zu\n", sizeof(ps)); //8
    printf("%zu\n", sizeof(pi));  //8
    printf("%zu\n", sizeof(pd));//8

    return 0;
}

//----------------------------------------------------------------------------指针类型的意义 2.1

cpp 复制代码
int main()
{
    int a = 0X11223344;
    int* pa = &a;
    *pa = 0;

    //---------------------------结论1----------------------------
    //指针类型决定了指针在被解引用的时候访问几个字节
    //如果是 int* 的指针,解引用访问四个字节
    //如果是 char* 的指针,解引用访问一个字节
    //推广到其他类型
    //如果是 double* 的指针,解引用访问八个字节

    return 0;
}

//100 10进制

//0x64 16进制

//110 0100 2进制

//144 8进制

//----------------------------------------------------------------------------指针类型的意义 2.2

cpp 复制代码
int main()
{
    int a = 0X11223344;
    int* pa = &a;
    char* pc = &a;
    printf("pa=%p\n", pa);
    printf("pc=%p\n", pc);
    printf("pa+1=%p\n", pa + 1);
    printf("pc+1=%p\n", pc + 1);
    //pa        = 000000F88CAFF994
    //pa + 1 = 000000F88CAFF998
    //pc        = 000000F88CAFF994
    //pc + 1 = 000000F88CAFF995
    //pa pc 两个结果一样,因为都存放的都是 a的地址
    //pa+1(加了4个字节) pc+1 (加了1个字节)结果不一样


    //---------------------------结论2----------------------------
    //指针的类型决定了指针+-1时,跳过几个字节
    //决定了指针的步长
    //想让指针一次访问几个字节,用对应的指针类型

    return 0;
}
cpp 复制代码
int main()
{
    int a = 0;
    int* pi = &a;  // pi 解引用访问4个字节,pi+1也跳过4个字节
    float* pf = &a; // pf 解引用访问4个字节,pf+1也跳过4个字节
    // int*  和 float* 可以通用?
    //不能

    *pi = 100;
    *pf = 100.0;
    //1120403456
    //100.000000
    printf("%d\n%f\n", *pi, *pf);
    //二者结果不同, int*  和 float* 对内存的解读方式有差异,不能混用    

    return 0;
}

//--------------------------------------------------------------------------------------------------------- 3 野指针

相关推荐
幽络源小助理8 分钟前
《已调试》SpringBoot景区寄存管理系统源码 - 免费JavaWeb项目下载 | 幽络源
java·开发语言·spring boot
豆沙沙包?12 分钟前
2025年--Lc302-415. 字符串相加--java版
java·开发语言
JIngJaneIL13 分钟前
基于Java民宿管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
azoo13 分钟前
cv::Mat 取元素引起的报错
c++·opencv·计算机视觉
杰克尼13 分钟前
蓝桥云课-13. 定时任务
java·开发语言·算法
m0_7269659817 分钟前
RAG小实战
开发语言·python
元素之窗22 分钟前
MATLAB 的输入与输出:一篇速查博客
开发语言·matlab·php
一个不知名程序员www27 分钟前
算法学习入门---list与算法竞赛中的链表题(C++)
c++·算法
CoderYanger29 分钟前
动态规划算法-路径问题:9.最小路径和
开发语言·算法·leetcode·动态规划·1024程序员节
无心水32 分钟前
【Python实战进阶】12、Python面向对象编程实战:从零构建搜索引擎,掌握封装、继承与多态!
开发语言·python·搜索引擎·python进阶·python面向对象·搜索引擎实战·封装继承多态