指针一

1|0指针

在我的理解中,指针是用来存放地址的。指针也有大小,对于不同类型的指针char,short,int,,,double,它们的指针大小都是8个字节,对于64位机器是这样的,而对于32位机器它们的指针大小都为4个字节。我的是64位操作系统:

#include <stdio.h> int main() { printf("%zd\n", sizeof(char*)); printf("%zd\n", sizeof(short*)); printf("%zd\n", sizeof(int*)); printf("%zd\n", sizeof(long*)); printf("%zd\n", sizeof(float*)); printf("%zd\n", sizeof(double*)); return 0; }

image
显而易见都是8个字节大小的指针。

#include <stdio.h> int main() { int a = 10; int* p = &a; printf("%p\n", p); return 0; }

分析以上代码:我们定义并初始化了一个int类型的整型变量a,它的值是10;那么此时内存就会给a分配一个int类型大小的空间用来存放a变量,那么也就是说在内存中有一个内存地址专门来指向a。我们想拿到变量a的地址就要用一个操作符,叫做取地址符&,通过&a我们就拿到了a的内存地址,当然我们拿到了a的内存地址就要那个变量把它存起来,所以我们用变量p把它存起来,而p的类型是一个指针*,而int表示p所指向的对象的类型是int类型。我们把p的值打印出来:
image
我们通常用16进制来存储地址。



那我们有了指针变量p如何改变变量a里的值呢,此时我们也要用到一个操作符叫做解引用符**p就等价于a,所以我们加入*p = 20;代码后原来a的值就会被重新赋值为20。

#include <stdio.h> int main() { int a = 10; int* p = &a; *p = 20; printf("%d\n", a); return 0; }

image

2|0const

在定义变量前加const表示该变量是一个伪常量,你不能直接修改例如:

#include <stdio.h> int main() { const int a = 10; a = 20; printf("%d\n", a); return 0; }

image
编译不通过。但你可以通过指针来间接去修改它的值:

#include <stdio.h> int main() {0 const int a = 10; int* p = &a; *p = 20; printf("%d\n", a); return 0; }

image
对于代码int* p = &a;,加入的const位置不同那么它的作用也不同,例如const int* p = &a;或int const * p = &a表示我们不能修改指针变量p所指向的那块内存空间里存的值。而int* const p = %a;,表示我们不能修改指针变量p存储的内存地址的值

3|0多重指针

#include <stdio.h> int main() { int a = 10; int* p = &a; int** pp = &p; int*** ppp=&pp; return 0; }

里面最多有一个三重指针,你每取一次地址就会加一重指针。

#include <stdio.h> int main() { int a = 10; int* p = &a; int** pp = &p; int*** ppp=&pp; printf("%d\n", ***ppp==a); printf("%d\n", **pp==a); printf("%d\n", *p==a); printf("%d\n",*ppp==&p); printf("%d\n",*pp==&a); return 0; }

image
printf中的等式两边都是等价的。

4|0指针的加减

#include <stdio.h> int main() { int arr[2] = {0}; int* p1 = &arr[0]; int* p2 = &arr[1]; printf("p2-p1=%zd\n", p2-p1); return 0; }

指针减指针的结果是它们之间差的元素个数
image
而指针加1的结果就要根据指针的类型

#include <stdio.h> int main() { int arr[2] = {0}; int* p1 = &arr[0]; int* p2 = &arr[1]; printf("p1=%p\n", p1); printf("p1+1=%p\n", p1+1); return 0; }

image
显而易见它们之间差了4个字节也就是一个int类型的大小。而对于char类型加1,它们之间相差为1也就是一个char类型的大小。

#include <stdio.h> int main() { char arr[6] = "hello"; char* p1 = &arr[0]; char* p2 = &arr[1]; printf("p1=%p\n", p1); printf("p1+1=%p\n", p1+1); return 0; }

image


__EOF__

本文作者若达萨罗
本文链接https://www.cnblogs.com/bcc0729/p/17552303.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   若达萨罗  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示