C语言西铁城24小时指针问题题

c语言指针问题_百度知道
c语言指针问题
2c语言指针问题目的是求输入数的正数的和和个数。1,我原来写入的是p,不能结束.既然p=a.第一个while为什么后面的(p-1),为什么,输入0结束
我有更好的答案
语句里。(p-1)
等于 a[0]的地址减去4。输入数据的程序应当改成这样写;n&,拍入0结束输入:指针
p 表示地址, *p 表示值。p-1 表示 地址等于
p - 1 * sizeof(int) ;
*(p-1) 表示 地址等于
(p - 1 * sizeof(int)) 里的值看不清楚你的屏幕照片; } while(*(p-1)!=0) {sum=sum+ *p; n++;%d %d&#92!=0);和的计算: sum=0;n=0; p=a;while( *p 。p=a; 表示 把数组 a 的首地址赋给 p, p 指向 a[0],sum: p=a;do{ scanf(&%d&,p); p++: printf(&}输出;p++
采纳率:89%
因为p是int型的指针,int型占2个字节,所以p+9相当于向后增加9*2=18个字节;194+12 这两个数在十六进制的情况下,应改写为194H+12H=1A6H.
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客访问: 508990
博文数量: 110
博客积分: 915
博客等级: 下士
技术积分: 2129
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
从编译器角度分析C语言中数组名和指针的区别数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变例如你可以写出下面这样的代码:int *p;p++;却不能写这样的代码:int a[];a++;那么数组名跟指针之间到底有什么区别呢?第一,在声明上,只有作为函数参数的数组名编译器总是转化成指针,其他情况下,数组名就是数组名,指针就是指针,二者不能混淆,你不能在一个文件中定义一个数组,而在另一个文件中把它声明成一个指针。char a[]; & &//定义一个数组aextern char* & &//在另一个文件中将a声明成一个指针在编译器中,符号表用来存放C语言中有关标识符的属性信息,这些信息集中反应了标识符的特征属性。等到词法分析到代码声称的各个阶段的时候,编译器需要根据源代码提出的要求,从表中获取不同标识符的不同属性。值得注意的是,数组标识符的属性和指针是完全不同的。因此,在一个文件中定义一个数组的时候,编译器会把它记录在符号表中,而在编译器分析另一个文件中的声明时,通过符号的语义检查发现不一致。也许这样的声明可以编译通过(在gcc下通过了),但是把一个数组名当成一个指针来使用,别指望它能运行起来。第二,指针是一个变量,而数组名不是。数组名是数组的首地址,它本身就是一个地址,对应到汇编语言级别就是一个常量,一个固定的数(地址)。因此数组名不能进行++,--等运算。在大多数编译器中,对数组的引用a[i]总是被编译器改写成*(a+i)的格式。也就是说,编译器每遇到a[i],都会把它当作*(a+i)来处理。我们都知道,*addr表示内存中(addr)的位置存储的值,比如*0x8048000就表示地址为0x8048000的内存中所存储的值。所以a[i]就表示a的值加上i所得到的数作为一个内存地址里面所存储的值。&那么a的值是什么呢 ???编译器在做词法分析和语法分析的时候,遇到一个数组的定义,就会把数组的有关信息汇集在一个叫做“内情向量”或“信息向量”的表格中,其中的信息包括数组的类型,维数,各维的上、下边界,以及数组的首地址,然后将这个“内情向量”相关信息存储在符号表中。数组定义后位置就是固定的,因此其首地址可以在编译阶段得到。当编译器到达代码生成的各阶段时,每次遇到数组名这个标识符,编译器都会从符号表中取出这个数组的首地址,然后用这个地址来替代数组名,例如,假设数组a起始地址是0x8048000,则a[1]就会被编译器转化成*(0x),因此在生成的汇编代码中,数组名已经完全被转化成一个常量,一个固定的数(地址)。但是对于指针p,它是一个变量,其值存储在地址&p中,这个值在编译时是不能得到的。因为是变量,所以指针可以作为表达式中的左值操作,如++或--,而被认为是常量的数组名却不可以,正如你可以骑走一辆自行车,但是不能骑走一棵树。另外,C语言把 数组下标 改写成 指针偏移量 的 &根本原因 &是指针偏移量是底层硬件所使用的基本模型。第三,对数组的引用,如a[i],或*(a+1),需要访存一次;而对指针的引用,如*(p+1),需要访存两次。a被认为是常数,所以取*(a+1)的值只需将a所表示的常数加1,然后从得到的地址里访存取一次即可。对于指针,需要先从&p这个地址里把p的值取出来,然后加1,再从得到的地址里访存取一次,一共需要两次访存。第四,假设a是一个数组名,而p是一个指针,当你使用 a 和 &a 时,得到值是一样的,都是数组的起始地址。而使用 p 和 &p 时,得到的值是不一样的, p 表示指针 p 所指向的地址,而 &p 表示 p 这个变量的地址。再假设 & p =则 p 就表示数组a的起始地址,而&p是存储数组a的起始地址的那个地址。这是因为编译器把a当成数组首地址,而&a当作数组第一个元素的地址,因此得到的值是一样的。另外,sizeof(a)得到的是a所表示的数组的大小,而sizeof(p)得到的是指针的大小。
阅读(5984) | 评论(3) | 转发(6) |
相关热门文章
给主人留下些什么吧!~~
受益匪浅,最近看《c专家编程》正好遇到了这个问题,及时帮我解决了。
:非常感谢博主的分析,受教了!但是有句话可能引起误解,如下:“假设数组a起始地址是0x8048000,则a[1]就会被编译器转化成*(0x)”如果a数组是char类型,这样说是完全没问题的,但是如果a数组是int类型(4B),那么a[1]就会被编译器转化成*(0x)总而言之:不同类型的指针变量在移动过程中(指针p+1)被编译器转化成内存的步长是不同的
最近一直比较忙,没关注博客,现在才看到你的评论,不好意思啊~确实,你说的对,以后对于这方面的小问题,还是会尽量避免的。。。 |
非常感谢博主的分析,受教了!但是有句话可能引起误解,如下:“假设数组a起始地址是0x8048000,则a[1]就会被编译器转化成*(0x)”如果a数组是char类型,这样说是完全没问题的,但是如果a数组是int类型(4B),那么a[1]就会被编译器转化成*(0x)总而言之:不同类型的指针变量在移动过程中(指针p+1)被编译器转化成内存的步长是不同的
请登录后评论。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
#include "stdio.h"
#include "stdlib.h"
struct Student{
void Init(struct Student* pStudent)
pStudent = (struct Student*)malloc(sizeof(Student));
int main()
struct Student *pS
Init(pStudent);
pStudent-&age = 1;
这段代码会奔溃,我调试发现指针pStudent没有初始化成功。然后我在Init里面修改pStudent-&age的值是没问题的,请大家指点一下
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
#include "stdio.h"
#include "stdlib.h"
struct Student{
struct Student* Init()
struct Student* pStudent = (struct Student*)malloc(sizeof(Student));
int main()
struct Student *pStudent = Init();
pStudent-&age = 1;
free(pStudent);
PS: C语言传递参数都是值语义,所有的东西都是拷贝。想要修改就得传递指针,你现在想要修改一个指针,那么就得传递一个指针的指针。void Init(struct Student** pOut)这种也是可以得。一般推荐返回一个指针。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Init()里面的malloc得到的那个pStudent没有被传出去过, main里的那个pStudent一直是野指针
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以通过二级指针:
include "stdlib.h"
struct Student{
void Init(struct Student** pStudent){
*pStudent = (struct Student*)malloc(sizeof(Student));
int main(){
struct Student **pS
Init(pStudent);
*pStudent-&age = 1;
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
难道不是分配内存写错了?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
难道不是分配内存写错了?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
楼上的答案已经很好了,补充一下,C语言只有值传递,没有引用传递。你这种用法传进去的指针其实也是做了一个拷贝,只不过里面存的地址不变,可以通过这个地址访问到原来的变量。可以做一个存放这个结构体指针的指针来传递数据
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 鼠标指针 的文章

 

随机推荐