指针 笔记

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值