各位少年,大家好,我是博主那一脸阳光
,今天给大家分享指针,内存和地址的使用,以及使用。
前言:
在编程的世界中,若论灵活多变、深邃神秘的角色,非“指针”莫属。如同哈利波特手中的魔杖,它赋予了C语言强大的魔法力量,能够直接操控内存空间,实现数据与功能的高效交互。对于许多初识C语言的开发者来说,指针可能像是一扇半掩的门,背后隐藏着令人既好奇又畏惧的秘密花园。
然而,只有深入理解并熟练掌握指针这一核心概念,才能真正领略到C语言的魅力所在——从底层内存管理到高级数据结构构建,从函数调用机制到复杂系统设计,指针无处不在,发挥着举足轻重的作用。这段奇妙的旅程将带你拨开指针表面的层层迷雾,揭示其背后的运行机制与应用技巧,助你在编程领域修炼出更为深厚扎实的内功,为驾驭C语言这艘巨轮驶向技术海洋的更深处奠定坚实基础。
指针变量的意义
指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各
种各样的指针类型呢?
其实指针类型是有特殊意义的,我们接下来通过指针的解引用来探讨。
int main()
{
int a=100;
int*pa=&a;
double p=3.14;
return 0;
}
指针的解引用
对比,下面2段代码,主要在调试时观察内存的变化
//代码1
#include <stdio.h>
int main()
{
int n = 0x11223344;
int *pi = &n;
*pi = 0;
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int n = 0x11223344;
char *pc = (char *)&n;
*pc = 0;
return 0;
}
上两段C语言代码中有什么其意呢?
调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0。
结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。
指针±整数
先看⼀段代码,调试观察地址的变化。
#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;
}
我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
这就是指针变量的类型差异带来的变化。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。
#include<stdio.h>
int main()
{
int arr[10] = {
0 };
int i = 0;
int* p = &arr[0];
for (i = 0; i < 10; i++)
{
*p = 1;
p =p+1;
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这段C语言代码主要功能是初始化一个整型数组,并通过指针遍历并修改数组的元素值,最后输出整个数组的内容。下面是对代码逐行详细解析:
C
#include<stdio.h>
引入标准输入输出库(stdio.h),使得程序可以使用printf等输入输出函数。
C
int main()
{
定义主函数main(),它是程序执行的入口点。
C
int arr[10] = {
0 };
声明并初始化一个包含10个整数元素的数组arr,所有元素初始值均为0。
C
int i = 0;
int* p = &arr