指针 笔记
来源:互联网 发布:使用美团数据分析 编辑:程序博客网 时间: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语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型处理。
- 指针笔记
- 指针笔记
- 指针 笔记
- 指针笔记
- 笔记--------指针
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针笔记
- 指针的指针习题笔记
- C++中指针笔记
- 国内验证码广告
- eclipse更改默认工作路径
- 【学习】ListView中控制子控件的隐藏和显示
- 8个超实用的jQuery技巧攻略
- html div三列布局占满全屏(左右两列定宽或者百分比、中间自动适应,div在父div中居底)
- 指针 笔记
- 如何做好站内文章优化
- 数列特征
- C#中数组的复制
- asp.net Excel导入和导出
- 单元测试使用spring注解获取bean
- jsp向数据库中插入中文乱码
- 如何做好站内文章优化
- 杜德伟遭经纪人控窃密诈骗 恐入狱11年