2{3[4(1/4ˉ1)ˉ1]ˉ1}ˉ1

设数列{An}满足a1=1,a2=2,an=1/3(an-1+2an-2)(n=3,4...)数列{bn}满足b1=1,bn(n=2,3...)是非零整数,且对_百度知道
设数列{An}满足a1=1,a2=2,an=1/3(an-1+2an-2)(n=3,4...)数列{bn}满足b1=1,bn(n=2,3...)是非零整数,且对
任意整数m自数k都-1&=bm+bn-1+...+b(m+k)&=1(1)求an ,bn通项公式
记cn=nanbn(n=1,2...),求数列{cn}前n项Sn
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁当前位置: >
> 一道C语言试题---转intmain(void){inta[4]={1,2,3,4};int*pt
一道C语言试题---转intmain(void){inta[4]={1,2,3,4};int*pt
weizy2288 & at
一道C语言试题 ---转
  int main(void)
  int a[4] = {1, 2, 3, 4};
  int *ptr1=(int *)(&a+1);
  int *ptr2=(int *)((int)a+1);
  printf("%x, %x/n", ptr1[-1], *ptr2);
  return 0;
  问,在x86平台下输出啥?
  题目虽然恶心了点,但作为一个例子来分析,还是挺好玩的。学过C语言的朋友可以暂且不看下文,自己试着分析一下,看看结果跟我的是否一样,也不失为一件趣事。
  下面把这道题牵涉到的所有边边角角的问题梳理一遍,详细讨论如下:
  1、&a+1
  首先明确,a是一个具有4个整型变量的数组的名字,具体地说是这种数组的首元素的首地址,而&a是数组的首地址,请注意措辞。而关于指针加1,则需要指针运算的知识。没学过指针运算或者已经忘记了这个知识点的朋友们,下面就是关于指针运算你需要知道的事实:
  就像上面的例子那样,式子&a+1表示的是指针加法运算,而不是普通的数值加法运算,之所以会这样是因为&a是一个指针而非普通数值(虽然它本质上也是一个整数)。那么你会问:加入此时&a=0xFFFF5700,那么&a+1是多少呢?答案是:取决于&a的类型 。
  a) 如果&a是一个指向char型的指针,那么&a+1 = 0xFFFF5701
  b) 如果&a是一个指向short型的指针,那么&a+1 = 0xFFFF5702
  c) 如果&a是一个指向int型的指针,那么&a+1 = 0xFFFF5704 (32位机器)
  d) 如果&a是一个指向某种结构体struct foo的指针,那么&a+1 = 0xFFFF5700+sizeof(struct foo)
  还没看出端倪吗?没错,指针加1不是指针内容简单地加1,而是让指针指向下一个数据 ,加2就是让指针指向下两个数据,这个数据的类型就是指针指向的类型,所以指针的加法究竟会让这个指针指向哪里,取决于这个指针指向的数据类型。
  因此,综上所述,当&a与整数1做加法时,实际上是指针的加法,加1的含义是:令指针a指向下一个数据 ,下一个数据是啥?当然是紧挨着的下一个具有4个整型变量的数组了(因为&a的类型是指向具有4个整型变量的数组的指针嘛),于是a的指向了4的下一个地址,在用此值初始化ptr1,因此ptr1的指向如图所示:
  由于在ptr1初始化的时候,令&a+1强制转换成整型指针(关于类型转换的详细讨论请参考),因此ptr1[-1]相当于把ptr1往前挪一个整型大小,即4个字节。 如下图:
  显然,打印出的第一个数字是a[3]的内容,即数值4.
  当然,我们还必须说明一个事实:数组下标是可以为负数的,实际上,取下标符“[ ]”的内部实现,就是指针运算!比如a[2],等价于*(a+2),即以a地址为基址,取偏移量为2的地址的值。所以ptr1[-1]等价于*(ptr-1)。
  2、(int *)((int)a+1)
  至于指针ptr2的处理更恶心一点,呵呵!它先是把数组名a强制转换成整型变量,然后再加1,然后再强制转换成整型指针!真罗嗦,但不要紧,咱有的是耐性,无非就是让ptr2指向a[0]的第二个字节罢了,此时ptr2指向如下图所示:
  显然,此时打印的内容就是ptr2所指向的往后4个字节的内容了,也就是a{0}的后三个字节和a[1]的第一个字节,那究竟会打印出啥玩意儿呢?上面的图没有画出里面的内容,要是把每个字节的内容都画出来就好了,呵呵!
  要把上图中每一个字节的内容都打印出来没问题,但是你先要知道字节序 的概念,字节序分两种,一种叫大端字节序(big-endian) ,当然除此之外必然有小端 字节序(little-endian) ,让我们用一个问题,来引出字节序的概念,然后再来搞定这两个小鬼吧!
  问题是这样的:对多字节存储的变量,机器是如何做出解释的??请看下图:
  假如这是一个普通的int变量,地球人都知道,在32机器上int占用4个字节存储数据,就像上图中显示的那样,在4个字节中放置了一堆数字,但是机器究竟会把这个数解释成0x0103070F呢,还是解释成0x0F070301呢?答案是:都有可能!
  官方解释:
  1、所谓大端(big-endian)序,就是高优先位 对应高有效位 。
  2、所谓小端(little-endian)序,就是高优先位 对应低有效位 。
  民间解释:
  1、所谓大端(big-endian)序,就是读取或者存放数据时,最低 位 对应 高地址 。
  2、所谓小端(big-endian)序,就是读取或者存放数据时,最低 位 对应 低地址 。
  如,要把0x0103070F存放进存储器中时,如果把0E放进高地址处则是小端序,如果把0F放进低地址处则是大端序。照此,上图中存放的数据如果被机器理解成0x0103070F则是该机器是大端序的,否则若被理解成0x0F070301则是小端序的。
  回到原来的问题,此时ptr2指向了a[0]的第二个字节。我们以x86平台为例(小端序),此时其内部数据分布是这样的:
  由于x86平台是小端序的,根据咱刚刚讨论过的理论,小端序的存取时最低 位 对应 低地址 ,因此将会打印出,如果题目中没有说明在x86平台,那答案是不确定的,取决于具体的平台,例如ARM平台就是大端序的。
  到此这个试题基本算是圆满解决了,但是我还想再罗嗦一下,关于代码中的那个a,以及那个&a,估计还是有很多朋友心里不怎么平坦吧,每次遇到数组啊指针啊,虽然程序好像仿佛貌似也没出啥毛病,但总感觉是混过去的,这次我们要彻底解决它。记得某人说过,一个真正的程序员,必须对自己写的代码的每一个细节了如指掌。
  再来考虑这个定义:
  int a[4] = {1, 2, 3, 4};
  这时我们必须明确,编译器根据我们提供的类型和数组大小,为我们分配了适当大小的存储区域,并且把这块存储区域叫做a,请注意 :&a,就像我们上面提到的,它的类型是“指向具有4个整型变量数组的指针“,简而言之&a是一个数组指针。这个数组的名字a,当它作为右值(简单而言,出现在赋值号“=”左边的就是左值,出现在赋值号“=”右边的就是右值)时代表的是数组首元素的首地址,而不是数组的首地址。此时a的意义跟&a[0]是等价的,都是指向首元素的指针。记住咯!
  数组的名字会在另一个地方与指针等价,那就是函数参数表,当出现在函数的参数表里面的时候,不管你写的是数组,还是指针,一旦进入函数内部,通通变成指针。
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-main(){ int a[3][3]={1,2,3,4,5,6,7,8,9}, m, k, for (m=0;m&3;m++) for (k=0;k&=m;k++)if ((m+k)%2){_百度知道
main(){ int a[3][3]={1,2,3,4,5,6,7,8,9}, m, k, for (m=0;m&3;m++) for (k=0;k&=m;k++)if ((m+k)%2){
main(){int a[3][3]={1,2,3,4,5,6,7,8,9}, m, k,for (m=0;m&3;m++)for (k=0;k&=m;k++)if ((m+k)%2){ t=a[m][k]; a[m][k]=a[k][m]; a[k][m]=t;}for (m=0;m&3;m++){{for (k=0;k&3;k++攻浮掇簧墀毫峨桐法昆)printf(&%d&,a[m][k]);printf(&\n&);getch();}}}该程序输出的第一行第二行是什么
本人C语言初学者,求大神解释
提问者采纳
3行的输出分别是:143258769你这样写不容易看清楚,换成正常的格式就比较方便了:#include&iostream&int main(){
int a[3][3]={1,2,3,4,5,6,7,8,9}, m, k,//普通定义数组,没什么好说的
for (m=0;m&3;m++)
for (k=0;k&=m;k++)//这两个for语句其实就是扫描了一遍数组a
if ((m+k)%2){
//这个其实就是关键,m+k要为奇数
t=a[m][k];//所以这交换操作其实就针对a[][]中的4个成员
a[m][k]=a[k][m];
//a[0][1]和a[1][0]交换;
a[k][m]=t;
//a[1][2]和a[2][1]交换
for (m=0;m&3;m++){
//正常输出2维数组a
for (k=0;k&3;k++)
printf(&%d&,a[m][k]);
printf(&\n&);
getchar();//每输出完一行,等待键盘确认
} }所以:123 --- 143456 --- 258789 --- 769仔细观察,也就是2和4互换位置,6和8互换位置
提问者评价
你的讲解 很详细
完全看懂了
其他类似问题
按默认排序
其他2条回答
for (m=0;m&3;m++) for (k=0;k&=m;k++) if ((m+k)%2)
{t=a[m][k]; a[m][k]=a[k][m]; a[k][m]=t;}当m+k为奇数时,交换a[m][k]和a[k][m],也就是a[0][1攻浮掇簧墀毫峨桐法昆]和a[1][0]交换,a[1][2]和a[2][1]交换初始是123456789转换后就是143258769
第一行:143第二行没有
第二行是256
只是我不知道怎么做
可以解释下么?谢谢
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在前面乘一个,然后再连续利用平方差公式计算;把每个因式逆用平方差公式分解,然后根据乘法结合率和有理数的乘法计算即可.
原式,,,;,,,,.
本题考查了平方差公式的运用,添加是解题的关键,利用平方差公式拆项后前一项与后一项出现倒数是解题的关键,计算中有时利用公式求解运算更加简便.
3672@@3@@@@平方差公式@@@@@@242@@Math@@Junior@@$242@@2@@@@整式@@@@@@49@@Math@@Junior@@$49@@1@@@@数与式@@@@@@7@@Math@@Junior@@$7@@0@@@@初中数学@@@@@@-1@@Math@@Junior@@
第三大题,第6小题
求解答 学习搜索引擎 | 阅读下列材料:某同学在计算3(4+1)({{4}^{2}}+1)时,把3写成4-1后,发现可以连续运用平方差公式计算:3(4+1)({{4}^{2}}+1)=(4-1)(4+1)({{4}^{2}}+1)=({{4}^{2}}-1)({{4}^{2}}+1)={{16}^{2}}-1.很受启发,后来在求(2+1)({{2}^{2}}+1)({{2}^{4}}+1)({{2}^{8}}+1)...({{2}^{2004}}+1)的值时,又改造此法,将乘积式前面乘以1,且把1写为2-1得(2+1)({{2}^{2}}+1)({{2}^{4}}+1)({{2}^{8}}+1)...({{2}^{2004}}+1)=(2-1)(2+1)({{2}^{2}}+1)({{2}^{4}}+1)({{2}^{8}}+1)...({{2}^{2004}}+1)=({{2}^{2}}-1)({{2}^{2}}+1)({{2}^{4}}+1)({{2}^{8}}+1)...({{2}^{2004}}+1)=({{2}^{4}}-1)({{2}^{8}}+1)...({{2}^{2004}}+1)=({{2}^{2004}}-1)({{2}^{2004}}+1)={{2}^{4008}}-1回答下列问题:(1)请借鉴该同学的经验,计算:(1+\frac{1}{2})(1+\frac{1}{{{2}^{2}}})(1+\frac{1}{{{2}^{4}}})(1+\frac{1}{{{2}^{8}}})+\frac{1}{{{2}^{15}}};(2)借用上面的方法,再逆用平方差公式计算:(1-\frac{1}{{{2}^{2}}})(1-\frac{1}{{{3}^{2}}})(1-\frac{1}{{{4}^{2}}})...(1-\frac{1}{{{10}^{2}}}).11:46:40【 转载互联网】 作者: &&|&责编:李强
&&& &为了解决用户可能碰到关于"#include&stdio.h&void main(){ int a[4]={1,2,3,4}; int *i=a;
printf(&%d&,*i); printf(&%d&,*(i+1));
/*输出*i和*i+1,一个是1,一个是2,说明地址加1"相关的问题,突袭网经过收集整理为用户提供相关的解决办法,请注意,解决办法仅供参考,不代表本网同意其意见,如有任何问题请与本网联系。"#include&stdio.h&void main(){ int a[4]={1,2,3,4}; int *i=a;
printf(&%d&,*i); printf(&%d&,*(i+1));
/*输出*i和*i+1,一个是1,一个是2,说明地址加1"相关的详细问题如下:RT,我想知道:#include&stdio.h&void main(){ int a[4]={1,2,3,4}; int *i=a;
printf(&%d&,*i); printf(&%d&,*(i+1));
/*输出*i和*i+1,一个是1,一个是2,说明地址加1===========突袭网收集的解决方案如下===========
解决方案1:对于数组这种数据结构的保存方式是以线性顺序保存在内存中的,拿int a[4] = {1,2,3,4};来说,系统分配四块长度为4的整型顺序排列的内存,并且通过指针指向这块内存的首地址,即a[0]的地址 (&a[0]),这个首地址一般用a来表示,这时候声明了一个整型指针i它接受了数组所在内存的首地址a,然后通过解释符*取出所指向的数据值,*i就表示取出i指向的内存的值,所以等于是*a,取出数组的第一个元素 * i = a[0];而*(i + 1)的意思是指针向后一位再取值,所以*(i + 1) = a[0 + 1] .
地址是按照内存单元分配地址的,而一个整形变量拥有4个字节,也就是有4个内存单元,那么这个整形变量是一个地址?还是4个地址?
每种类型在内存中都对应一定的长度,也就是如果不分配固定长度给它,它将丢失一部分数据,比如类型间的类型转换。所以可以把一定长度内存单元组成起来的一块内存看成一种大的单元,即类型。这块内存拥有一个地址。int a = 5; int *p = &a;就是它的地址。只不过数组是多个这样的内存块排列在一起
不是每个内存单元是一个地址么?也只有这样才能分配内存地址。如果一个类型一个地址的话,也就是说int是4个内存单元一个地址,但是double又不是4个,另外一块儿内存如果现在存的是整形,下一次存的是double型,那么肯定无法分配地址啊。
如果你坚持现在的理解的话,那么你的题目是没法做了。数据内存是系统去分配,这是一块内存,你不能继续往下分了。否则你将会把一个int分成32位bit......
书上说的是这样啊,系统分配是按内存单元分配的啊,也就是说假如数组第一个int地址是1的话,第二个int地址就是5,这种地址和你说的指针不同,指针+1是指的储存空间移动一个,也就是说到下一个数据。&a[0]+3*4=&[3]这个式子是书上的,你看下
解决方案2: int *i=a,说明i=a【】的首地址。i+1就是a[ ]中2的地址。
关键是 一个内存单元是一个地址 ,而一个int型变量占4个字节啊,不是应该有4个地址么
小伟0、0懂么D.H,速度 我要睡了
地址加1就加了4个字节,因为有int *i=a。如果 char *i=a,那i+1地址就加一个字节。书上这样说的
但是不懂啊 *p不就是将地址中的数据取出来么?+1要是加4个的话,那么就和内存分配矛盾了,地址按内存单元分配,而一个内存单元一个字节啊。就是快说+1是下一个地址,也就是下一个内存单元啊
解决方案3:数组名就是数组的首地址,即a[0],赋值给指针i后,再+1取值不就是a[1],就是2呀,这有什么疑惑?
12345678910

我要回帖

更多关于 CNˉ 的文章

 

随机推荐