tc2.0环境下的C语言研究-需要耐心的指针研究
来源:互联网 发布:云计算与大数据前景 编辑:程序博客网 时间:2024/06/06 12:16
以下程序代码为王爽老师所著书的内容,希望像我一样的新手能静下心来仔细跟踪下来,一定不会让你失望的。
程序1
用debug对以下程序进行分析,记录每一条c语言运行后,相关内存单元的值。
char ch;
char *p;
char **pa;
char far *pf;
int n;
main()
{
p=(unsigned char *)0x1000;
ch=*(unsigned char *)0x1000+*p+*(unsigned char far *)0x200;
p=&ch;
*p=*p+1;
pa=&p;
**pa=**pa+1;
pf=(char far *)&ch;
*pf=*pf+1;
n=(int)&ch;
*(char *)n=*(char *)n+1;
}
本人从头至尾跟踪下来了,要点:结合指针的定义,可以发现,“*”叫做取地址符是有其含义的。“指针”是个地址概念,是指内存中存储单元的地址。存储单元的地址和存储单元的内同是两个不同的概念。在我们的输出中曾用到,用printf函数输出结果,这是直接通过变量名和变量对应空间的地址访问了存储器中的数据。指针则是另外一种访问方式的表达,就是先把变量占用存储单元的地址存放在一种特殊的变量中,然后通过这个其值为地址的新变量来访问变量。
再来试试程序2
typedef struct{
int number;
char c;
char name[8];
}stu;
stu a;
char *pchar;
int *pint;
stu *pstu;
main()
{
pstu=&a;
pstu->number=1;
(*pstu).c=80;
pstu->name[0]='T';
pstu->name[1]='o';
(*pstu).name[2]='m';
(*pstu).name[3]=0;
pchar=0;
pint=0;
pstu=0;
pchar=pchar+1;
pint=pint+1;
pstu=pstu+1;
}
最后的几句代码是不是感到很熟悉的知识出现了,不同类型的指针进行++运算后,地址实现了sizeof(类型)的加大。
程序3 指针与数组
char *p;
char far *pf;
char str[20]="hello world!";
int a[8]={11,22,33,44,55,66,77,88};
int n;
main()
{
pf=(char far *)0x200;
for(n=0;str[n];n++)
*(pf+n)=str[n];
p=str;
pf=(char far *)0x210;
for(n=0;p[n];n++)
pf[n]=*(str+n);
for(n=0;n<8;n++)
((int far *)0x220)[n]=*(a+n);
for(n=0;n<8;n++)
*(int far *)(0x230+n*2)=*(&a[0]+n);
}
通过程序给人的第一感觉就是:数组和指针是一回事。错错错!其实指针和数组是没有任何关系的,只是外表太相似罢了。
int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};
pa =a;
for (i=0;i<=9;i++)
{
printf ( “%d”, *pa );
pa++ ; //注意这里,指针值被修改
}
可以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译出错,不能成功。可以理解为指针是指针变量,而数组名只是一个指针常量。
继续深入的话,可以看《C语言深度剖析》中指针和数组,里面的举例可以起到醍醐灌顶的作用。
通过以上的代码查看,需要记住的要点:
1.指针和数组和完全不同的东西。
2.a为数组名,&a和a是同一个值,但是&a代表的是数组的地址,a代表的是数组首元素的地址,尤其应用++运算时要注意实现的结果。
3.常用的指针解释
int *p p为指向整型数据的指针
int(*p)[n] p为指向含有n个元素的一维数据的指针变量
int *p[n] p为指针数组,含有n个元素,每个元素可指向一个整型变量
int **p p为一个指针变量,可指向一个指向整型数据的指针变量
4.指针的使用:可以把一个指针的值赋给另一个指针;指针可同整数加减;不能对两个指针进行加减,更不可乘除;两个指针可以进行比较.
- tc2.0环境下的C语言研究-需要耐心的指针研究
- tc2.0环境下的C语言研究-关于链接
- tc2.0环境下的C语言研究-搭建基础环境
- tc2.0环境下的C语言研究-关于main函数编程
- tc2.0环境下的C语言研究-函数如何接收不定数量参数
- tc2.0环境下的C语言研究-变量与参数返回值
- tc2.0环境下的C语言研究-简单使用寄存器并打印函数的偏移地址
- c语言tc2.0的压缩文件的大小一般是多少
- Bezier曲线的绘制 (C语言+TC2.0实现)
- 需要研究的
- 需要研究的新技术
- 需要研究的网站
- 智能指针的研究
- C语言的变参的研究
- 指针的指针问题研究
- C语言“可变参数”的研究
- C语言字符数组的初始化研究
- 研究C语言的参数执行顺序
- UIScrollView UITableView 上提刷新代码
- mysql和orcal的比较。
- apue(3)
- Android读写XML(上,中,下)
- 实现Flex HotKey 键盘四个方向键(Navigation)导航功能
- tc2.0环境下的C语言研究-需要耐心的指针研究
- Android中多线程编程并传递多个参数的简单例子
- 数据结构学习笔记之链表分析与实现(二)
- JAVA基础------IO操作(三)
- 对Web设计和开发人员有用的15个Chrome插件
- 备份恢复数据数据库案例二--利用在线备份恢复数据库。
- Android中的两把锁:WalkLock、KeyguardLock
- 关于TS流的解析
- apue(4)