C/C++中的指针

最近在用C语言,后来发现还要用C++做库,自然要用到称作指针的东西,以前虽然基本会用了,不过又忘了,只能重头学起了

假设a的地址是1000,也就是在1000的地方开辟一个int型的空间,放了一个数字8

int a=8;

q是一个指针,指向一个int类型,它可能存在地址2000的位置

int *q;

把a的地址写给q指针,也就是把1000存在了2000的位置,**这里用到了q是地址q里的内容8,&a是变量a的地址1000*

q=&a;

还是定义指针p,不过它是指向一个指向int地址的指针,比如指向上边q的地址2000的指针,p存在3000里

int **p;

把q指针的地址2000放到指针p里

p=&q;

下边这些变量分别是多少呢?

a,q,*q,p,*p,**p
a=8, q=1000, *q=8, p=2000, *p=1000, **p=8

明白了这些就可以再看参数的传递和字符串的定义了,"void *"啥意思?你管我指的啥呢,我TM就是个指针!

#include <stdio.h>
int main()
{
  int a=8;
  printf("a=%d &a=0x%08x\n",a,&a);  //a=8 &a=0xbebc1654
  int *q;
  printf("q=0x%08x\n",q);  //q=0x00000000
  printf("&q=0x%08x\n",&q);  //&q=0xbebc1650
  q=&a;
  printf("*q=%d q=0x%08x\n",*q,q);  //*q=8 q=0xbebc1654
  int **p;
  printf("p=0x%08x\n",p);  //p=0x000102f8 ??
  printf("&p=0x%08x\n",&p);  //&p=0xbebc164c
  p=&q;
  printf("p=0x%08x\n",p);  //p=0xbebc1650
  printf("*p=0x%08x\n",*p);  //*p=0xbebc1654
  printf("**p=%d\n",**p);  //**p=8

  void *v=&a;
  int **vv=(int **)&v;
  printf("**vv=%d\n",**vv);  //**vv=8

  char *c=(char *)&a;
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);

  c=(char *)p;
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  printf("c=0x%08x\n",c);
  printf("*c=0x%02x\n",*c++);
  return 0;
}

结果如下

a=8 &a=0xbec1664c
q=0x00000000
&q=0xbec16648
*q=8 q=0xbec1664c
p=0x000106a8
&p=0xbec16644
p=0xbec16648
*p=0xbec1664c
**p=8
**vv=8
c=0xbec1664c
*c=0x08
c=0xbec1664d
*c=0x00
c=0xbec1664e
*c=0x00
c=0xbec1664f
*c=0x00
c=0xbec16648
*c=0x4c
c=0xbec16649
*c=0x66
c=0xbec1664a
*c=0xc1
c=0xbec1664b
*c=0xbe

参考资料:
http://www.cnblogs.com/nannanITeye/archive/2013/04/05/3001089.html

标签: none

添加新评论