【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

简介: 【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

一.指针是什么?

对于初学者来说,最容易弄混的就是指针的含义,导致错误的应用,因此我们今天先来讲讲指针是什么。

指针理解的2个要点:

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

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

总结:指针就是地址,口语中说的指针通常指的是指针变量。

内存与指针变量

内存

2dd38a309c3742e3b7a7e1779dcdaf84.png

指针变量

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


#include <stdio.h>
int main()
{
    int a = 10;//在内存中开辟一块空间
    int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
    //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个之指针变量。
    return 0;
}

总结:

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

那这里的问题是:

一个小的单元到底是多大?(1个字节)

又如何编址?

经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);

那么32根地址线产生的地址就会是:

bf623e603ec44a1390b24de90f73e63d.png

64位机器同理,有64位地址线,这里仅以32位机器为例。

二进制,由于有32根地址线,所以一共有2的32次方个字节的空间,也就产生了这么多的编号。

1f320629a2ac4140a095a39c63dcf714.png

我们知道(2^32Byte = 2^32/1024KB =2^32/1024/1024MB = 2 ^32/1024/1024/1024GB = 4GB)

此时我们就能给4GB的空间进行编址。

这里我们就明白:

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

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

总结:

指针变量是用来存放地址的,地址是唯一标示一个内存单元的。

指针的大小在32位平台是4个字节,在64位平台是8个字节


二.指针和指针类型

与变量相同,指针也有不同的类型。

int *p;     //定义一个指针变量P,指向整形变量 
char *p;    // 定义一个指针变量p,指向字符型变量 
float * p;    // 定义一个指针变量p,指向单精度浮点型变量 
double *p1, *p2;    //定义两个指针变量p1和p2,指向双精度实型变量 

这里可以看到,指针的定义方式是: type + * 。(type指类型名)

指针±整数

我们来看一下代码:

#include <stdio.h>
//演示实例
int main()
{
    int n = 10;
    char* pc = (char*)&n;
    int* pi = &n;
    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    return 0;
}

d744839bcd8c4794b54ebb81e5f80542.png


这里的%p是打印地址的意思。

1.我们从打印结果可以看出&n与pc的地址是相同的,也就是说两者指向同一处。(这里由于n是int类型,我们需要将它强制类型转换成char类型再使用)

2.由2和3我们可以看出指针加1也就是地址加1即地址指向朝后的一位。

- 3.从3,4,5我们可以看出,不同类型的指针加1朝后跨越的地址是不同的,与指针变量的类型有关。

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)

但是,这里我们要知道,在相同的操作系统下,指针变量的大小都是相同的!

指针变量的大小

上面我们讲了指针在内存中存放的方式以及存储的空间大小,空间有多大自然就有多大的地址,也就是有多大的指针。

用代码测试一下:

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
  printf("%d\n", sizeof(char *));
  printf("%d\n", sizeof(short *));
  printf("%d\n", sizeof(int *));
  printf("%d\n", sizeof(double *));
  return 0;
}

cacb5cc06e2e498ca5c24e6df18d1f8a.png


我的电脑是64位平台,因此指针的大小为8个字节

总结:

32位平台下地址是32个bit位(即4个字节)

64位平台下地址是64个bit位(即8个字节)


指针的解引用

#include <stdio.h>
int main()
{
    int n = 0x11223344;
    int* pi = &n;
    *pi = 0;
   char* pc = (char*)&n;
   *pc = 0;
    return 0;
}

b876f9c778d649f398ce7df6263f1f2c.png

以上是pi在内存中的存储,当我们把pi中的值改为0后

d15b3676a9a64b14b6b99da0183bc2ae.png

4个字节中存放的数据全部被改为0

487ea5f7f9234f15844544ddd54c4348.png

以上是pc在内存中的地址,我们可以看到当也把地址中的数据改为0后,却只改了一位字节的地址.

总结:

指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

比如: char * 的指针解引用就只能访问一个字节,而 int * 的指针的解引用就能访问四个字节。

总结

今天的内容暂时到这里就结束了,我们今天先讲了指针的定义,类型,大小,以及不同类型的指针的不同之处,剩下的部分我们分批次后续进行讲解

好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!


**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

20fa3306e76244de9879742c165c792a.gif



目录
相关文章
|
21天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
74 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
17天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
87 14
|
21天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
46 9
|
21天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
40 7
|
21天前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
31 5
|
21天前
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
38 2
|
24天前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
68 4
|
24天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
24天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
41 2
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
105 13