c语言指针%p,浅谈C语言指针(示例代码)

下面就几种情况讨论指针。

一.指针和变量

变量是存储空间的别名,访问形式是直接访问。

指针访问内存地址是间接访问。

使用指针访问内存的场合:1.局部变量,参数传递    2.动态分配内存

指针本身也是一个变量,用来保存内存地址的变量,也有存储空间。使用他来访问存储空间,会浪费存储空间,并是访问速度变慢。

二.指针和数组

使用指针打印数组元素值demo如下

#include

int main ()

{

int array[10]={1,2,3,4,5};

int *parray=array;

printf("%d\r\n",*paaray);

printf("%d\r\n",*paaray+1);

printf("%d\r\n",*paaray+2);

printf("%d\r\n",*paaray+3);

printf("%d\r\n",*paaray+4);

return 0;

}

打印结果:1 2 3 4 5

一般情况下,数组名=常量字符串,但在做sizeof和&(取地址)运算时不等于常量指针。

eg:

#inlcude

int main()

{

int array[10]={1,2,3,4,5};

int  *paddrarray=&array;  // 数组的地址,和数组首元素地址相同

printf("%p\t%p\r\n",parray,paddrarray);打印结果相同

printf("%p\t%p\r\n",parray+1,*paddrarray+1);打印结果相同,都是int型指针+1

printf("%p\t%p\r\n",array,&array+1);打印结果不同,一个是数组首元素地址+1,一个是数组地址+1

//array+1----array+sizeof(*array)

//&array+1----array+sizeof(*&array+1)

return 0;

}

下面附一个很有意思的例子:

1ab9364aa0837b20ae3ec3df2105fab4.png

41fd7e0a5ba170b09158cff81a055bbc.png

打印结果为:

ca8e9234eba10541016898e5f42fe6f9.png

show-11508.html

在main.c中欺骗了编译器,指针当成数组使用,char数组中实际是“hello world”的内存地址

正确打印为:

f3ec5b368b436bfa93abf703a4012796.png

结果为:

6555bf73eadf259ed2345e87acd5a00f.png

pstr是指针地址,转换成内存地址格式(unsigned int*)格式,(*(unsigned int *)pstr))是HELLO WORLD 的地址,整个即为值HELLO WORLD.

数组作为函数参数传递时会被降级为指针,下面附几个例子做对比

64a010547c3f52aedc3b1c0a88555114.png

0050e557c61a0da54623da4840dc05db.png

60d71271c548dce357959d361f7db263.png

2215bec8f1c40fee5906a9142350fc1b.png

1156b0a2d98936ee144c8907764185e7.png

e82290a34ff7924c2e0dd05df4442f8c.png

三.指针运算(偏移运算)

连续空间的运算才是有意义的,规则:p+sizeof(*p)

#include

int main()

{

int array[10]={1,2,3,4,5};

char *parray=array;

printf("%p\t%p\r\n",parray+1,array+1);//parry+sizeof(*parray)  (1Byte);

//array+sizeof(*array) (4Byte);

return 0;

}

而对于堆上的指针运算是没有意义的,是未定义的结果。

eg:int *p1=(int*)(malloc)(sizeof(int));

int *p2=(int*)(malloc)(sizeof(int));

p2-p1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值