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.指针的使用:可以把一个指针的值赋给另一个指针;指针可同整数加减;不能对两个指针进行加减,更不可乘除;两个指针可以进行比较.

原创粉丝点击