C指针
指针和内存
1.指针的声明
指向未初始化的内存的指针可能会产生问题。如果将这种指针解引,指针的内容可能并不是一个合法的地址,就算是合法地址,那个地址也可能没有包含合法的数据
//声明一个指针
int num;
int *pi;
2.如何阅读声明
![](https://img.haomeiwen.com/i23157134/39ee4dc405b7ab62.png)
3.地址操作符(&)
//地址操作符&返回操作数的地址,可用地址操作符初始化指针
num = 0;
pi = #
4.打印指针的值
//显示pi的地址和内容,pi的内容时num的地址
printf("Address of pi: %d Value: %d\n",&pi, pi);
printf("Address of pi: %x Value: %x\n",&pi, pi);
printf("Address of pi: %o Value: %o\n",&pi, pi);
printf("Address of pi: %p Value: %p\n",&pi, pi)
//输出,%x表示十六进制,%o表示八进制,%p将值显示为实现专用的格式,通常是十六进制数
Address of pi: 4520824 Value: 4520836
Address of pi: 44fb78 Value: 44fb84
Address of pi: 21175570 Value: 21175604
Address of pi: 0044FB78 Value: 0044FB84
//在不同的平台上用一致的方式显示指针的值比较困难,一种方法:把指针转换为void指针,然后用%p格式说明符来显示
printf("Value of pi: %p\n", (void*)pi);
5.内存使用方式
![](https://img.haomeiwen.com/i23157134/0f8e138ffd934d72.png)
6.间接引用操作符(*)解引指针
//*返回指针变量指向的值,称解引指针
nt num = 5;
int *pi = &num
printf("%p\n",*pi); // 显示为5
7.null
-
null概念: 指指针包含了一个特殊的值,和别的指针不一样,它没有指向任何内存区域。两个null指针总是相等的
-
NULL宏: 是强制类型转换为void指针的整数常量0, 通常理解为null指针, 定义在多种头文件中, 包括stddef.h、stdblib.h和stdio.h
#define NULL ((void*)0)
-
ASCII字符NUL: 全0的字节
-
null字符串; 是空字符串,不包含任何字符
8.void指针
void指针是通用指针,用来存放任何数据类型的引用
void *pv
//void指针具有与char指针相同的形式和内存对齐方式
//void指针和别的指针永远不会相等,不过,两个赋值为NULL的void指针是相等的
//任何指针都可以被赋给void指针,它可以被转换回原来的指针类型,这样的话指针的值和原指针的值是相等
9.全局和静态指针
int *globalpi;//全局指针
void foo()
{ static int *staticpi;//静态指针
...
}
int main()
{
...
}
栈帧被推入栈中,堆用来动态分配内存,与栈和堆所处的数据段不同的数据段存放全局/静态变量
![](https://img.haomeiwen.com/i23157134/1f11a89c7a950148.png)
网友评论