C指针(1):指针和内存

C指针

指针和内存

1.指针的声明

指向未初始化的内存的指针可能会产生问题。如果将这种指针解引,指针的内容可能并不是一个合法的地址,就算是合法地址,那个地址也可能没有包含合法的数据

//声明一个指针
int num;
int *pi;

2.如何阅读声明

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.内存使用方式

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()
{    
    ...
}

栈帧被推入栈中,堆用来动态分配内存,与栈和堆所处的数据段不同的数据段存放全局/静态变量

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。