首页 > 代码库 > 浅谈C语言指针

浅谈C语言指针

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

一.指针和变量

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

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

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

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

二.指针和数组

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

#include<stdio.h>

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<stdio.h>

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;

}

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

技术分享

技术分享

打印结果为:

技术分享技术分享

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

正确打印为:

技术分享

 结果为:

技术分享

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

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

技术分享

技术分享

 

技术分享

技术分享

技术分享

技术分享

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

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

#include<stdio.h>

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;

浅谈C语言指针