C语言中指针的一些归纳总结(一)

张开发
2026/5/1 3:51:37 15 分钟阅读

分享文章

C语言中指针的一些归纳总结(一)
1.指针变量的类型和意义指针指向的都是元素的地址在X64环境下所有指针的大小都是8个字节而在X86环境下所有指针的大小都是4个字节。那么不同的指针大小相同为什么还有各种不同类型的指针呢请看下面两个代码。#include stdio.h int main() { int n 0x11223344; int *pi n; *pi 0; return 0;#include stdio.h{ int main() { int n 0x11223344; char *pc (char *)n; *pc 0; return 0; }第一个运行结果将n的四个字节全都改成0了。而第二个运行结果只将第一个字节改成了0原因是int*类型的指针控制四个字节对应int类型的四个字节同理char*类型的指针只能控制一个字节。可以理解为不同类型的指针控制字节的范围不同。让我们往下继续看。2.指针-整数观察下面代码#include stdio.h int main() { int n 10; int* pi n; char* pc (char*)n;//类型不同该处将n转换成char*类型 printf(n的地址为%p\n, n); printf(pi%p\n, pi); printf(pi1%p\n, pi1); printf(pc%p\n, pc); printf(pc1%p\n, pc 1); return 0; }运行结果如下可以看出int*类型的指针1走了四个字节而cahr*类型指针只走了一个字节。同理可推断当指针为其他类型指针如数组指针函数指针-整数即为跳过其类型大小的字节。3.关于void*类型指针众所周知void类型无返回值其属于无类型类指针他可以接受任意形式的地址但是并不可以进行指针-整数的运算。看以下例子#include stdio.h int main() { int a 10; int* pi a; char* pc a; return 0; }该处用char*类型的指针接收了a而a是int整型类型。类型不匹配导致编译器报警告但是如果用void*就可以接受各种类型的地址#include stdio.h int main() { int n 10; char m c; void* p1 n; void* p2 m; }这次编译器没有报警告说明void*可以接收各种类型的地址后面在函数指针内容部分void*有很大作用4.assert断言:assert断言对程序员十分友好可以帮助程序员找到BUG所在。使用格式assert(表达式) 如果表达式为真则程序继续运行如果为假则弹出警告并告诉你是哪里出的问题。使用assert断言需要包含头文件assert.hassert断言帮助程序员解决BUG但是缺点是会增加程序的运行时间如果确认程序没问题后则可以引入#define NDEBUG编译器就会禁用所有的assert语句。当想继续使用assert断言是时将#define NDEBUG注释掉即可。当转换到release版本时也默认将assert语句禁用因为release版本尽可能减少不必要的操作即默认程序没有BUG来优化程序运行。

更多文章