c语言兔子繁殖问题 问题

C语言问题_百度知道
while(i&lt,_________);N)scanf(&;%d&quot#define N 10void arrin(int x[N]){ int i=0;}在下划线处应填入的是
提问者采纳
x[N]是越界,要输入每个元素。符合要求。另外。 x[0]没有输入,A 没有自加 死循环 B 地址不对,导致输入的是x[1]到x[N]。 而且++也是后自加。但是由于是前自加。D 这个地址的形式是对的,由于是循环,所以这里需要填一个地址,自加也没有C 这个正确 x+i和&x[i]等效,所以。这样,再i++。即先输入x[i],i的初始值为0,就必须是后自加,所以这里要负责i的自加。即x[i]的地址,要输入数组首先。所以这个也不对
x+i和&x[i]等效这是规定的吗?还是通过算法得出的?
算是规定吧。这个不属于算法范围。在C语言中,数组名等同于常量指针。而指针和常数做加法,就会偏移常数个元素的位移。所以a+i就是&a[i].
那a+i和a[i]是等价的吗?
a+i和&a[i]等价 不是a[i];a[i]是元素值,而&a[i]是地址。这两个是不一样的。*(a+i)和a[i]等价。
提问者评价
明白了,多谢
其他类似问题
为您推荐:
其他1条回答
C选C,x+(i++) 等价于 &x[i++]
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c语言问题_百度知道
机输入一批(不超过100人)学生的学号和身高;%d%d&* 输入提示 */***********************************************************************/else aver=0;void main( ){i++) {
if(sg[i]&;在两条星线间填入相应代码;学号
身高\***********************************************************************&#47,;
&#47.0fcm或超过170cm的学生人数是%d人\%d%d&i&lt,&sg[i]); }/ /),sg[100]; printf(&);i++) {
scanf(& /输入一批(不超过100人)学生的学号与身高; printf(&身高超过平均身高%;100;* 输出结果 *&#47,n=0;* 求平均身高
*/n&quot, printf(&, 输入一批学生学号与身高;***********************************************************************/n&quot.h&;/
n=n+i,sum=0,sg[i]); /&#47,count-满足条件人数,xh[i];
count=count+1;在两条星线间填入相应代码,求身高和与总人数 /
&#47,count=0;
sum=sum+sg[i];170)
printf(&quot,sum-身高和 *&#47:\
int xh[100];aver||sg[i]&/n&quot,统计超过平均身高或身高超过170cm的学生人数并输出相应的学生信息和统计结果;n&quot,&xh[i],count);身高超过平均身高或身高超过170cm的学生信息\* n-总人数;
for(i=0;0)aver=sum/ printf(&***********************************************************************&#47, 输出满足条件的学生信息 &#47,n);
} }/i& if(n&n;n。#include &lt
n=n+1,&sg[i]);清空当前输入缓存(连续使用 scanf 时最好这样做)
scanf(&quot,最后输入 0,超过了100; &#47,0 后回车,%d&quot,如 23;/ } 每输入两个数后回车;%d;i&100;
sum = sum+sg[i];
if(xh[i] == 0 || sg[i] == 0) break. 似乎应当把 n=n+i
改成 n=n+1 或 n++ 还有其他问题n 越界了,45 回车;:
for(i=0, NULL);i++) {
setbuf(stdin:建议这样修改,&xh[i]
其他类似问题
为您推荐:
其他1条回答
因为你控制输入的循环已经规定了i是从0到99;){scanf(&,&sg[i])。while(xh(i),&xh[i],sg是身高.,n没起到作用; sum=sum+sg[i];)用美元符号做输入结束符号。而你这个“自认为统计总人数”的n=n+i.首先你这个程序输入个数是不可控的,后面一样!='%d%d&$'
n++.,N是人数,必须要输入100个; i++,相当于n=1+2+3+,那是不可能的
您可能关注的推广
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁&此声明定义了一个 int 的同义字,名字为 size
第12题:考查typedef类型定义,函数指针
typedef int (*test) ( float * , float*)
&tmp 的类型是
(a) 函数的指针,该函数以 两个指向浮点数(float)的指针(pointer)作为参数(arguments)
Pointer to function of having two arguments that is pointer to
(c) 函数的指针,该函数以
两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型&
Pointer to function having two argument that is pointer to float
and return int
(d) 以上都不是
另外一例:
typedef void(*ptr_tp_func)(int);
ptr_tp_func signal(int, ptr_tp_func);
2.统计i有多少位为1:for( ; i&=i-1) k++;
4&&&&&&&#define&&&&
#undef&&&&&
取消已定义的宏
#if&&&&&&&&
如果给定条件为真,则编译下面代码
#ifdef&&&&&
如果宏已经定义,则编译下面代码
#ifndef&&&&
如果宏没有定义,则编译下面代码
#elif&&&&&&
如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif&&&&&
结束一个#if……#else条件编译块
#error&&&&&
停止编译并显示错误信息
5. 有10个指针的数组 int *p[10];
指向有10个整形数数组的指针 int (*p)[10];
指向函数的指针,函数有一个整型参数并返回一个整数型 int (*p)(int);
一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 int (*p[10])(int);
6.如何引用一个已经定义的全局变量?答:引用头文件或extern。
7.软件测试都有那些种类?  
 黑盒:针对系统功能的测试   
&&&白盒:测试函数功能,各函数接口
8.const的终极考察:
&& 1.作用:a.告知参数的应用目的
&&&&&&&&&&&&&&&&
b.使优化器产生紧凑的代码
&&&&&&&&&&&&&&&&
c.保护不希望被改变的参数:防止参数意外改变
&& 2.例子:a.&
& a是一整型常量
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
c. const int *a; 指针a指向的内容不可变
&&&&&&&&&&&&&&&&
d. int *指针a指向的内容可变,但指针不可变
&&&&&&&&&&&&&&&&
e. int const *&都不可变
9.自动变量?非静态变量的局部变量,只在定义时创建,函数返回时由系统自动回收。
10.关键字volatile:意想不到会改变的,优化器在用到这个变量时都重新读取,而不是使用保存在寄存器里的备份。
应用举例:
a.并行设备的硬件寄存器
&&&&&b.一个中断子服务子程序会访问到的非自动变量
c.多线程应用中被几个任务共享的变量(优化器的优化作用)
关于c,(1)在本线程内,当读取一个变量时,为提高存取速度,编译器优化时会将变量读取到一个寄存器中,以后再使用该变量时直接从寄存器中读取。(2)当变量值在本线程内改变时,会同时把变量的新值copy到寄存器中,以保持一致。(3)在变量的值因别的线程而改变了值的时候,本寄存器内的值不会改变,从而导致应用程序读取的值和实际的值不一致。(4)当该寄存器的值因别的线程而改变了值的时候,原变量的值不会改变,从而导致应用程序读取的值和实际的值不一致。
面试的问题:
a.一个参数既可以是const又是volatile吗?
b.一个指针可以是volatile吗?
答:a.可以,例子:只读的状态寄存器,它是volatile因为可能被意想不到的改变,是const因为不希望程序试图去改变它。
&&&&&&&&&&
b.可以。一个例子是中断服务子程序修改一个指向一个buffer的指针时。
此类考题记住volatile型变量可能随时改变即可。
11.访问特定内存位置:设置一绝对地址为0x67a9的整型变量的值为0xaa66
&&& ptr=(int
*ptr=0xaa66;
12.类型不同的操作数运算,精度向低级自动转换。无符号+有符号=无符号
13.评价代码:unsigned int zero=0;
&&&&&&&&&&&&&&&&&&&&&&
unsigned int compzero = 0xFFFF;
&&&&&&评价:对于一个int型不是16位的处理器来说,上述代码是不准确的。应编写如下:
&&&&&&&&&&&&&&&&&&&&&&
unsigned int compzero=~0;
嵌入式程序员应该很懂得处理器字长的重要性。
14.宏写出swap(x,y):
&#define swap(x,y)
x=x+y;&&&&&
y=x-y;&&&&&
15.一句实现判断x是不是2的若干次幂:x&(x-1)?false:
16.大小端:大端---高字节低地址(单字节存放),测试程序
int checkSystem( )
{union check
c.i=1;&&&&&&&
return (c.ch==1);
intelx86小端序,arm、powerpc等大端序,网络字节序大端序。
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏
&另一种测试大小端的程序:
利用linux中自带的宏进行判断:
#if __BYTE_ORDER ==
__LITTLE_ENDIAN&
小头字节序&
#elif __BYTE_ORDER ==
__BIG_ENDIAN&
// 大字节序
17.break:终止本层循环;continue:终止本次循环。
18.设 int a=12,则执行完语句 a+=a-=a*a后,a的值是-264.
19.为什么要有动态内存分配?为那些长度在运行时才知的数组分配内存空间,记住要检查是否分配成功!
calloc与malloc相比:calloc分配的内存被初始化为0,calloc两个参数:元素个数,元素大小
realloc:修改内存大小。
20.&找出下面一段ISR的问题。
__interrupt double compute_area (double radius)
double area = PI * radius *
printf("\nArea = %f", area);
&1)ISR不能传递参数。
&2)ISR不能有返回值。
&3)ISR应该短且有效率,在ISR中做浮点运算不明智。
21.一个链表不知道头结点,有一个指针指向其中一个结点,请问如何删除这个指针指向的结点:将这个节点复制成下一个节点的值,然后删除下一个节点
22.const与define比较:define的东西没有分配内存,预编译时候就被替换掉了;const编译时进行类型检查
23.野指针:指向未知内存的指针,不可用的内存。
产生原因:1.指针未初始化(所以要么设置为NULL,要么指向合法地址)
&&&&&&&&&&&&&&&&&&&&&&
2.指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free
&&&&&&&&&&&&&&&&&&&&&&&&&
和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有
&&&&&&&&&&&&&&&&&&&&&&&&&&把指针本身干掉。通常会用语句if
(p != NULL)进行防错处理。很遗憾,此时if语句起不到防错
&&&&&&&&&&&&&&&&&&&&&&&&&
作用,因为即便p不是NULL指针,它也不指向合法的内存块。
24.内存泄露:&未释放已经不再使用的内存。一般指堆内存的泄露,堆内存使用完后必须显式的释放,free或&
delete掉(否则就有内存泄露),注意还要把指针指向NULL,防止产生野指针。
25.实现左移循环移n位:a=(a&&n)|(a&&(8*sizeof(int)-n));
26.为什么要进行内存对齐?保证CPU每次取相同长度的数据进行运算,也就是每个变量一次就可以取完。而且对于32位机器,地址每次应该从能被4整除开始?抛弃前面或后面多余的,每个变量的存储不应该超过4字节边界或最长元素长度的边界。
如何禁止内存对齐?#pragma pack(1)嵌入式系统一般禁止内存对齐,以节省存储空间
27.一个变量只有一个地址,但每个字节都有一个地址。
28.&&&&&&&&&&&&
&内联函数(inline)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
带参数的宏
&&&&&&&&&&&&&&
编译(汇编)时展开&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
预编译时替换
&&&&&&&&&&&&
严格的参数类型检查&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&简单的替换
函数体不能太大,不能包含大循环和递归&&&&&&&&&&&&&&&&&&&&&&&
内联函数适用于函数体较小且频繁使用的函数,调用时进行代码的复制,无需跳转、入栈等操作,以空间换时间而且因为函数有严格的参数类型检查,比宏要安全;内联函数在编译时不单独产生代码&&。
29.int restrict
*p;保证了p是指向该内存的唯一指针,着块区域的唯一入口,如何修改这块内存的操作必须通过p才可以完成,方便编译器进行优化,有利于并行执行。&
30.c中函数参数默认是从右向左压栈的,printf计算参数时也是
arr[]={6,7,8,9,10};&&&&
int *ptr=&&&
*(ptr++)+=123;
&&&&&printf("%d,%d\n",*ptr,*(++ptr));结果为8
8.即printf内的参数从右向左运算。
31.位运算要考虑机器字长,算术运算符优先级高于移位运算符
&&& unsigned
char = 0xA5;&& unsigned
char& b = ~a&&4+1;
则b为250.&&&&&&&&&&&&
32.void GetMemory(char
*p,int num)
{p=(char *)malloc(sizeof(char)*num);}
这段代码的评价:这段函数意图动态申请内存,p是函数调用时传递的参数的一个copy,他们(实参和形参)一开始指向同一块内存,但申请内存后,p指向新的地方,而原参数还指向原来的地方,所以原参数不会指向刚申请的内存。
33.定义:分配内存;声明:描述类型。
int a[3]={0,1,2};
a:表示取数组第一个元素的地址;&&&
sizeof(a)=3*4=12;
&a:表示取整个数组的首地址; sizeof(&a)=4。
虽然a和&a的值相同,但表达的含义完全不同,a表示取数组第一个元素的地址,而&a表示取数组的首地址。它们代表的类型也完全不同,a是一个int型指针,而&a是一个int
(*p)[]型指针,即数组指针。所以a+1和&a+1得到的结果不同,a+1表示将指向该数组的第一个元素的指针向后移一个步长(这里的步长为数组元素类型所占的字节数);而&a+1表示将指向该数组的指针向后移动一个步长(而此处的步长为数组元素个数*元素类型所占的字节数)。
34.#define BIT3 (0x1&&3)
void set_bit3(int a){a&|=BIT3;}
&&&&&&&void
clear_bit3(int a){a&&=~BIT3;}
35.简述strcpy、sprintf与memcpy的区别
(1)操作对象不同:strcpy两个操作对象均为字符串,sprintf的源操作对象可以是多种数据类型,
目的操作对象是字符串,memcpy操作对象是两个任意课操作的内存地址
(2)执行效率不同,memcpy最高,strcpy次之,sprintf最低
(3)功能不同,strcpy实现字符串变量间的拷贝,sprintf主要实现其他数据类型到字符串的转化,
memcpy主要是内存块间的拷贝
36.死锁deadlocks,是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力,他们都将无法推进下去。产生死锁的4个必要条件:
a.互斥条件:一个资源只能被一个进程使用
b.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
c.不剥夺条件:进程已获得的资源,在未使用之前,不能强行剥夺
d.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
一般互斥条件是无法破坏的,预防死锁方法:破坏不可剥夺条件,破坏循环等待条件。即三种预防措施:a.采用资源静态分配策略,破坏部分分配条件;b.允许进程剥夺
使用其他进程占有的的资源,从而破坏“不可剥夺”条件;c.采用资源有序分配法,破坏环路条件。
37.进程和线程的区别
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
(1)一个程序至少有一个进程,一个进程至少有一个线程。
(2)线程的划分尺度小于进程,使得多线程程序的并发性高。
  另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,极大地提高了程序的运行效率。&
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
  进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配调度的独立单位。
  线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
  一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
38.PE(portable execute)可移植的执行体文件:EXE、DLL、COM
39.数组与指针的区别:指针至少是指向一个东西的,数组则是存储了东西,虽然数组可以像指针那样访问元素,但是指针的释放(我是指函数返回导致的释放局部指针,并不是free),并不会释放掉它指向的东西,当然free掉一个指针是指释放指针指向的内存块,该指针却还是存在的,所以free过后还要将指针置为NULL,防止野指针的出现。
char* get_str()
&&& char *str =
{"abcd"};//可以,因为这里的abcd存储在全局区(实际应该叫常量区),函数返回后,str被释放,但是abcd却还在,是依然可以用的,函数返回的不过是abcd的地址,之后立即释放掉str。
&&& //char str[]
= {"abcd"};//错误,结果不确定,因为这里的abcd存储在数组里面,即栈上,函数返回则释放
&&& return
又一段程序,有什么错误,怎么修改?&
char *strdest="hello";
&char *strsrc="word";
&strcat(strdest,strsrc);
&40.评价NULL和0:在指针上下文,他们是等价的,ANSI将NULL定义为((void
*)0),在指针上下文两者是等价的,而NULL是在提醒程序员,这里操作的是指针;在需要其他类型0
的时候,即使NULL能工作,也不该使用
41.三个float:a,b,c .问值 (a+b)+c==(b+a)+c 和(a+b)+c==(a+c)+b
不一定相等,float存在大数淹没小数的情况,如&
a=,b=-,c=0.;&
结果是1e-011和0;&
尽量把数量级相近的数先相加
42.register告诉编译器,这个变量是热门的,经常被使用,要把它放在寄存器中。这简化了编译器的设计,却把包袱丢给了程序员
43.堆栈区别:Heap是堆,stack是栈。&
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。&
Stack空间有限,Heap是很大的自由存储区&
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。&
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行
44.快速求一个数的7倍:X&&3-X
45.比较链表和数组:数组的元素顺序存储,链表则随机;数组按下标访问元素,速度比链表快;链表插入删除等操作无需移动元素,所以速度比数组快
46.堆棧溢出?沒有回收垃圾導致的
47.可重入的函数:可以被中断的函数,中斷返回后繼續執行該函數不會出現錯誤。不使用全局變量、中斷向量錶等系統資源。如果使用全局變量,必須採取措施,比如關閉中斷、使用信號量等。
中断向量表:是指入口地址的与段基值,一个中断向量占据4字节空间。中断向量表是8088中最低端1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量。在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。函数不可重入大多数是因为在函数中使用了全局变量(包括static)。例如,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表。
所以在中断中,考虑到多线程问题,不应该使用printf等不可重入函数。
48.信号量(Semaphore),有时被称为信号灯,是在多环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
49.#define后面只跟一个“参数”是什么意思?定義宏,并在預處理過程中將其替換為空字符串(即刪除)。作用:標記內容,使程序閱讀者能夠清楚標記表明的意義,同時又不影響被編譯的代碼;另外這些標記能被#ifdef、#ifndef檢測到,防止頭文件被重複編譯。這樣使用宏的缺點是,每次開啟或關閉宏都要重新編譯,因為宏只在編譯時展開。
50.指针和数组的区别:&
a[9]="abcdefg";&&&&
char *p="abcdefg";
数组:数组名a在编译器符号表上具有一个地址,比如9980,对数组元素的引用,如a[i],先取i的值与9980相加,然后取地址9980+i的内容。
指针:指针名p在编译器符号表上具有一个地址,比如4624,运行时对p的访问,先取4624的内容,如5081,然后取5081的内容。如果有助于的引用:p[i],则先取i的值与5081相加,然后取5081+i的内容。所以定义为指针,外部声明却为数组时,p[i]提取声明的内容显然是字符,但编译器却把它解释成地址,所以出错。
其它区别:1.指针保存数据的地址,如p保存的是常量字符串“abcdefg”地址,对p内容的修改是非法的
;数组保存的是数据,对数组的内容可以直接修改。
&&&&&&&&&&&&&&&
&2.指针通常用于动态的数据结构,数组存储固定数目且类型一致的数据
51.BSS段:未初始化的全局变量和静态变量;数据段:初始化的全局变量和静态变量;代码段(或文本段):可执行文件的指令;局部变量运行时创建并存储于栈,函数结束即释放;静态变量和全局变量则在程序结束后释放;可执行文件中包含BSS段所需要的大小,但不是BSS段,堆栈等在程序运行时创建。未完待续。。
52.EAX也是一种32位通用。 EAX寄存器称为,AX寄存器是算术运算的主要寄存器,所有的输入、输出只使用AL或AX作为数据寄存器。在80386及其以上的微处理器中,EAX寄存器可以用来的偏移地址。
  EAX可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位进行访问。它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。
53.关于assert:a.assert只在DEBUG模式下有效;b.java下启动断言需要在编译时加参数;c.断言计算的表达式为假,则调用abort终止程序的执行;
使用的注意事项:1)在函数开始处检验传入参数的合法性如;2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败;3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如assert(i++&&span
style="color: rgb(128, 0, 128);
"&100);因为如果执行之前i=100,i++就不会被执行,正确应该是assert(i&100);i++;4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。
5)有的地方,assert不能代替条件过滤。
54.#include
int main(void)
& unsigned char a = 0xa5;
& unsigned char b = ~a
& printf("b = %d\n",b);
& return 0;
} 这个程序八股的一塌糊涂
55.sizeof和strlen区别?
a.sizeof是一个操作符,strlen是一个函数
b.sizeof的参数可以是数据类型,也可以是变量,而strlen只能以结尾为'\0'的字符串
c.变压器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。
d.sizeof计算的数据类型占内存的大小,strlen计算的是字符串实际的长度,不包括'\0'
e.数组做sizeof的参数不退化,传递给strlen就退化为指针了
56.c中的malloc和c++中的new有什么区别?
(1)new、delete都是操作符,可以重载,只能在c++中使用
(2)malloc、free是函数,可以覆盖,c、C++中都可以使用
(3)new可以调用对象的构造函数,对应的delete调用相应的析构函数
(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数
(5)new、delete返回的是某种数据类型的指针,malloc、free返回的是void指针
57.unsigned int intvert(unsigned int x,int p,int
n)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b0001
0001,p=4,n=3转换后x=0b.转换,
其实就是每位都与1做异或的结果
unsigned&int&intvert(unsigned&int&x,int&p,int&n){
x^=(((1&&n)-1)&&p);//(1&&n)-1
to get n 1 is so smart.
58.struct中如何用成员的地址找到结构首地址
&stdio.h&&&
&#define abc(s,m)
(size_t)&(((s*)0)-&m)&&
&#define bcd(ptr, type, member) ({const
typeof(((type*)0)-&member)*
__mptr=(ptr);\&&
&(type*)((char*)__mptr-abc(type,member));})&&
& &&struct test
m.a = -1;&&
m.t = 37;&&
p = bcd(&(m.t), struct test,
printf("%d\n",
return 0;&&
发表评论:
馆藏&34645
TA的推荐TA的最新馆藏[转]&[转]&[转]&C语言问题_百度知道
-、差、商(+,/)输入两个实数和一个操作符号(小于1000),决定是否反复运行,*,根据用户输入y或者n,输出其和、积
提问者采纳
else if(op=='
scanf(&quot,;+';n&/;n&quot,a/,&choose);
scanf(&quot,a-b);%lf\%c&%lf\)
printf(&quot.h&gt,b;'
else if(op==&#39,&op);
return 0;-'b),a*b);/
else if(op==&#39,&b;约定每行输入的整数和操作符之间都有空格
if(op=='n&/%c&quot#include &%lf %lf %c&;n&)
printf(&y&#39,&choose);%lf\)
printf(&;%lf\
printf(&;int main(){),&a;
}while(choose==&#39,a+b);*&#39
其他类似问题
为您推荐:
您可能关注的推广
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 约瑟夫问题c语言 的文章

 

随机推荐