程序员

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

2020-05-26  本文已影响0人  miamendax

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

8.void指针

void指针是通用指针,用来存放任何数据类型的引用

void *pv
//void指针具有与char指针相同的形式和内存对齐方式
//void指针和别的指针永远不会相等,不过,两个赋值为NULL的void指针是相等的
//任何指针都可以被赋给void指针,它可以被转换回原来的指针类型,这样的话指针的值和原指针的值是相等

9.全局和静态指针

int *globalpi;//全局指针
void foo() 
{    static int *staticpi;//静态指针    
 ...
}
int main()
{    
    ...
}

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

上一篇 下一篇

猜你喜欢

热点阅读