已解决问题

c语言的小问题

50
[ 标签:c语言 ]

int main()
{
int a = 7;
int* c;
char* k;
char l = 'y';

c = &a;
printf("c %p *c %d\n", c, *c);
printf("c %p *c %d\n", c, *c);
c++;
printf("c %p *c %d\n", c, *c);


k = &l;
printf("k %p *k %c\n", k, *k);
k++;
printf("k %p *k %c\n", k, *k);
return 0;
}

解释每一步的意思

%p是什么啊,看不懂。

指针递加代表什么意思?

问题补充  2009-11-05 20:46

对不起刚刚我发的程序漏了一步步,我愿追加30分,麻烦你们帮我解释下漏掉的部分:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int a = 7;
int* c;
char* k;
char l = 'y';

c = &a;
printf("c %p *c %d\n", c, *c);
(*c)++;
printf("c %p *c %d\n", c, *c);
c++;
printf("c %p *c %d\n", c, *c);


k = &l;
printf("k %p *k %c\n", k, *k);
k++;
printf("k %p *k %c\n", k, *k);
return 0;
}

问题补充  2009-11-05 21:04

经过一番波折,我已经完全理解这个程序的每一步意思,谢谢朋友们,我再加30分再问一个问题

这个程序的目的是什么,哟来解决解决什么问题?

云爱*沉蝎 回答:2 人气:132 解决时间:2009-11-05 21:24
  
满意答案

%p是输出指针指向的地址

指针自增表示指针指向当前变量地址的下一个地址

比如 int a[2];

p = a; // 此时p = &a[0]

++p; // 此时p = &a[1]


int main()
{
int a = 7; // a = 7
int* c; // int型指针c
char* k; // char型指针k
char l = 'y'; // l = 'y'

c = &a; // c指向变量a
printf("c %p *c %d\n", c, *c); // 输出c的值以及c指向变量的值,指针的值就是指针所指向变量的地址
printf("c %p *c %d\n", c, *c); // 一样的
c++; // c增加一个位置,指向&a的下一个位置
printf("c %p *c %d\n", c, *c); // 同上


k = &l; // k指向变量l
printf("k %p *k %c\n", k, *k); // 输出k的值以及k指向变量的字符
k++; // k指向&l的下一个位置
printf("k %p *k %c\n", k, *k); // 同上
return 0;
}



我就只说你增加了的部分吧:


printf("c %p *c %d\n", c, *c); // 输出指针c的值(也就是整型变量a的地址),然后输出a的值(7
(*c)++; // 对指针c解引用得到变量a,然后增加a的值(a=8
printf("c %p *c %d\n", c, *c); 同上,不过这次a的值是8
c++; // c指向&a后的一个地址(&a+1
printf("c %p *c %d\n", c, *c); // 同上(不过严格来讲这种做法是不可取的



这个代码就是示例了一下指针的用法,如何对指针赋值;如何通过指针访问指针引用的变量并修改这个变量的值;以及基本的指针算术(eg: c++,k++),其他没什么用。

不过有几处是需要指出的:

int a = 7;

int* c = &a;

++c; // 这个时候c已经指向了一块非法的内存

printf("c %p *c %d\n", c, *c); // 此时对c解引用(*c)有可能会造成程序崩溃

提问人的追问   2009-11-05 21:16

恩,已近完全理解,谢谢朋友,不过有一点好像上面的朋友说的对啊,我把它复制下来啊

“c++;//c向前挪动一个单位 再显示 因为我们现在不知道c地址增加一以后指向哪里 所以也就不知道是什么内容“这句话是另外一位朋友说的,我也觉得是移动啊~

团队的补充   2009-11-05 21:25
同样的意思
你这样好了
你把变量a的地址相向成钟上的12点
c = &a;就是让分针c指向这个点钟
*c就获得c指向这个点钟的值(12)
c++就是把c指向12的后一个位置或者向前挪动一个位置,指向1点
c--就是把c指向12前一个位置或者向后挪动一个位置,指向11点
评价答案
  • 是否解决问题(参与评价0次)
  • 0
  • 0
  • 0
  • 是否原创答案(参与评价0次)
  • 0
  • 0
云爱*沉蝎的感言:
真心感谢
满意答案

都帮你写了注释

如果还是有不懂的地方

可以继续问我


int main()
{
int a = 7;//定义一个int型变量为7
int* c;//定义一个int型的指针c
char* k;//定义一个char型的指针k
char l = 'y';//定义一个char l并赋值等于'y'

c = &a;//让指针c指向a的地址 也就是说c指向的内容就是a即*c=a
printf("c %p *c %d\n", c, *c);//%p表示显示指针的值 整个内容就是显示c 这里是c的地址 然后再显示c的内容
printf("c %p *c %d\n", c, *c);//这里同上
c++;//c向前挪动一个单位 再显示 因为我们现在不知道c地址增加一以后指向哪里 所以也就不知道是什么内容
printf("c %p *c %d\n", c, *c);//这句话也验证了我上面说的

//这下面的语句解释也跟上面一样
k = &l;
printf("k %p *k %c\n", k, *k);
k++;
printf("k %p *k %c\n", k, *k);
return 0;
}

回答人的补充   2009-11-05 20:47
(*c)++;
应该是漏掉这句了吧
这句的意思是把c指向的值 也就是a++
也就是说a=8了
提问人的追问   2009-11-05 20:52

这位朋友的这句话

“printf("c %p *c %d\n", c, *c);//%p表示显示指针的值 整个内容就是显示c 这里是c的地址 然后再显示c的内容

为什么和上面一位朋友回答的不一样啊,刚好反了?是什么情况啊?

还有这个程序有什么目的啊?

回答人的补充   2009-11-05 21:00
是一样的啊 我把两句话都帖出来你看看
%p表示显示指针的值 整个内容就是显示c 这里是c的地址 然后再显示c的内容
输出c的值以及c指向变量的值,指针的值就是指针所指向变量的地址
其实意思都是
先显示c自己的值 也就是指针的值 然后再显示*c的值 也就是c这个地址里存储的值

回答人的补充   2009-11-05 21:06
这个程序的目的
其实就是用来让你更好的理解
什么是指针类型 指针类型的运算是怎么回事
指针类型的值 以及指针类型指向的值
回答采纳率:42.8% 2009-11-05 20:40
评价答案
  • 是否解决问题(参与评价0次)
  • 2
  • 0
  • 0
  • 是否原创答案(参与评价0次)
  • 2
  • 0
云爱*沉蝎的感言:
真是谢谢你了

相关内容