读书人

C语言指针有关问题

发布时间: 2012-06-07 15:05:14 作者: rapoo

C语言指针问题
#include<stdio.h>
#include<stdlib.h>
typedef int Elem;
typedef struct
{
Elem *elem; //指向顺序表的指针
Elem length; //顺序表长度
}Sqlist;
void Input(Sqlist l,int size); //输入la lb
void Combine(Sqlist la,Sqlist lb); //合并la lb
void Order(Sqlist l); //从大到小排序
int main()
{
int size; //顺序表长度size 计数器
Sqlist la,lb;
printf("请输入顺序表la中元素个数\n");
scanf("%d",&size);
la.length=size;
Input(la,size);
printf("请输入顺序表lb中元素个数\n");
scanf("%d",&size);
lb.length=size;
Input(lb,size);
Combine(la,lb);
scanf("%d",&size);
return 0;
}
void Input(Sqlist l,int size)
{
int i;
//l.length++; 错误 因为仅为length申请内存但是没为其赋值所以length的值是原来内存中的值没有意义
l.elem=(Elem*)malloc(size*sizeof(Elem));
for(i=0;i<size;i++)
{
printf("请输入第%d个元素\n",i+1);
scanf("%d",l.elem+i);
}
for(i=1;i<=l.length;i++)
{
printf("第%d个元素为%d\n",i,*(l.elem+i-1));
}
Order(l);
}
void Order(Sqlist l) //冒泡排序法 对整个一维数组排序 而打擂台尽是找出最值
{
Elem t; //中间赋值变量
int i,j,*p;
/*for(i=0;i<l.length-1;i++)
for(j=0;j<l.length-i-1;j++)
if(*(l.elem+j)>*(l.elem+j+1))
t=*(l.elem+j),*(l.elem+j)=*(l.elem+j+1),*(l.elem+j+1)=t;*/
printf("排序输出\n");
for(i=0;i<l.length-1;i++) //地址自增法
for(p=l.elem,j=0;j<l.length-i-1;j++,p++)
if(*p>*(p+1))
t=*p,*p=*(p+1),*(p+1)=t;

for(i=1;i<=l.length;i++)
{
printf("第%d个元素为%d\n",i,*(l.elem+i-1));
}
}
void Combine(Sqlist la,Sqlist lb)
{
Sqlist lc; //合并后的表
int j; //计数器
lc.length=la.length+lb.length;
printf("合并后表长度为%d\n",lc.length);
lc.elem=(Elem *)malloc(lc.length *sizeof(Elem));
if(!lc.elem)
printf("申请内存失败\n");
for(j=0;j<la.length;j++)
{
*(lc.elem+j)=*(la.elem+j);
printf("%d",*(lc.elem+j));
}
for(j=0;j<lb.length;j++)
{
*(lc.elem+j+la.length)=*(lb.elem+j);
}
for(j=1;j<=lc.length;j++)
{
printf("第%d个元素为%d\n",j,*(lc.elem+j-1));
}
}

*(lc.elem+j)=*(la.elem+j);试了好多次,发现是这一句有问题。
求高手解释!!!


[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

读书人网 >C++

热点推荐