指针 笔记

来源:互联网 发布:使用美团数据分析 编辑:程序博客网 时间:2024/05/23 11:58

1)指针与字符串   

   const char *arg[2];     arg[0] = "hello world from thread1";     arg[1] = "hello world from thread2"; 

 arg[]是一个指针数组,数组里面的元素是指向char型的指针。arg[0]arg[1]是该数组的两个元素,都是char *型,所以要赋值一个地址。 

 char *s="Pretend in New York!";等价于:   char *s;   s="Pretend in New York!";

2)通过一个例子来完全了解指针

先上程序》

typedef struct {int a;int b;}T_AB;int main(int argc, char **argv){char c;int a;T_AB tTest;int *p;int **pp;/* 1. */p = &a;printf("p = 0x%x, a'addr = 0x%x\n", p, &a);/* 2. */*p = 0x12345678;printf("a = 0x%x\n", a);/* 3. */p = &c;printf("p = 0x%x, c'addr = 0x%x\n", p, &c);/* 4. */*p = 'A';printf("c = %c\n", c);/* 5. */p = &tTest;printf("p = 0x%x, tTest'addr = 0x%x\n", p, &tTest);/* 6. */*p = &tTest;printf("tTest.a = 0x%x, tTest'addr = 0x%x\n", tTest.a, &tTest);/* 7. */pp = &p;printf("pp = 0x%x, p'addr = 0x%x\n", pp, &p);/* 8. */**pp = 0xABCD1234;printf("tTest.a = 0x%x\n", tTest.a);return 0;}
现在来绺一绺,它们在内存中的变化情况


先假设它们存放地址:c 100;  a 200;   p 600;   tTest  1000;   pp 2000;

1>  p=&a;  假设a存在地址为200的格子里,则 p=200即c8,&p即p的地址还是600.所以就是600地址里存的数是200.

 2> *p=0x12345678;

p所指向的4字节(因为是int型的指针,所以是4字节),其内容是0x12345678.  p指向a的地址,所以就是让a=0x12345678

3> p=&c;         c的地址是100.所以p=100;

4> *p=’A’;

p所指向的4字节,其内容等于’A’.0x41

这里有一个问题,c原来只占用一个字节,现在占用了4个字节,就把原来100后面3个字节的内容给覆盖掉了.

5> p=&tTest;     test的地址是1000.p的地址是600,所以地址600里的内容是1000.

6> *p=&tTest;

p所指向的4字节,其内容等于1000.所以地址1000里的内容是1000.

7> pp=&p;     &p等于600,pp的地址是2000

pp所指向的4字节,其内容等于600.所以地址2000里的内容是600.

8> **pp=0xABCD1234;

  可以理解为 *(*pp) ,*pp:pp的值是600,600里的内容是1000.所以*pp=1000.

*(1000)=0xABCD1234:访问地址1000,让它的内容等于0xABCD1234

地址1000存放的是tTest.a的值,所以 tTest.a=0xABCD1234.

口诀

*变量:把变量的值作为地址,去访问这个地址的内存.

最后附上执行结果:


3(void*)0 的理解

一般把(void*)0定义为NULL,表示这是个空指针。

void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型

转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。

例如:
float *p1;
int *p2;
p1 = p2;

其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;

但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。

面的语句编译出错:
void *p1;
int *p2;
p2 = p1;

提示“'=' : cannot convert from 'void *' to 'int *'”。
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型处理。







0 0