-
有环的单向链表跟无环的单向链表不可能相交 -正确
- 有环的单向链表和无环的单向链表不能相交,因为当相交的时候,无环的单向链表也会被迫存在一个环,只不过这个环的”起点“可能不是原来单向链表的头结点
-
如果两个单向链表相交,那这两个链表都一定不存在环 -错误
- 单向链表相交可以存在环
- 意思就是链表相交,要么都有环,要么都无环,不可能出现其他情况,出现其他情况就不是线性结构就不符合链表的定义
-
执行"int x=1;int y=~x;"语句后,y的值为? ——-2
- 假设int占2个字节,那么1的二进制表示是 0000 0001 ,~表示按位取反,则 0000 0001变为 1111 1110,在计算机中整数用补码形式表示,正数的补码是它本身,负数的补码是原数值除符号位按位取反再加一,由补码求原数值也是按位取反再加一,那么 1111 1110 除符号位按位取反再加一变成 1000 0010,即 -2。
-
若函数的定义出现在主函数之前且仅被主函数使用,则可以不必再说明
- 正确(如果不是仅被主函数调用,就是错的)
-
若一个函数(非主函数)没有return语句,返回类型是void
- 错误(构造函数和析构函数都没有返回类型,也没有return语句)
-
++、–不算做赋值运算,只能说是一个表达式
-
有char a[10]=”abc”;,则strlen(a)的值为3,strlen函数返回字符串的长度,不包括末尾的’\0,sizeof(a)才是10
-
#include命令的功能是()
- 在命令处插入一个文本文件(注意不是在文件首部插入一个头文件)
-
当顺利执行了文件关闭操作时,fclose函数的返回值是()
- 如果正常关例了文件,则函数返回值为0;否则,返回值为非0
-
定义类型并不会分配空间,只有在定义变量时才会分配内存空间
-
int a[10];
-
问下面不可以表示a[1]地址的是()
- &a[0] + 1
- a + sizeof(int)
- (int*)&a + 1
(int*)((char*)&a + sizeof(int))
-
a为数组的时候
&a + 1 移动sizeof(数组)字节a + 1 或者 &a[0] + 1 移动sizeof(int) ,即移动到下一个数组元素
B是指向a[4]
C将a变成了指针 int *类型,指针+1 都是移动sizeof(int) ,移动到下一个元素的
D指针绕来绕去的,变成char* 后 +4 ,移动 4* (sizeof(char)),移动四个字节,然后又重新强转成了int*,依然指向下一个元素
-
-
已知i,j都是整型变量,下列表达式中,与下标引用
X[i][j]
不等效的是()-
*(X[i]+j)
-
*(X+i)[j]
-
*(X+i+j)
-
((X+i)+j)
-
a[m]相当于*(a+m)就是说 [] 符号如果要去掉的话,相加,括号,再取地址。。。反过来也一样
-
B应该也是错误的,由于[]的优先级高于*,因此,相当于对地址
(X+i)[j]
取值,如果B改为(*(X+i))[j]
就对了 -
a[i][j] =*(a[i]+j) = *(*(a+i)+j) =(*(a+i))[j]
-
-
-
print函数声明为void print(int a,char b=‘b’,int c=1); 下面函数调用正确的是()
-
print(‘a’);
print(5,8);
print(5,‘#’);
print(5,‘#’,2);
-
C++在调用函数时,当实参和形参的数据类型不一致时,会发生数据类型转换!将低精度转换为高精度时,由编译器隐式完成;将高精度转换为低精度时,必须用强制类型转换运算符:static_cast<>()来转换才不会造成数据丢失。精度由低到高: char->int->double->long double。CD肯定对, A的话字符转为整数即为97, B 选项在将整数类型 8 复制给 char 时,会发生截断赋值。把整数的前3*8位去掉 直接后8位赋值给char
-
-
fprintf函数只能以字符串的形式写入到文件中
-
int` `s[4][5],(*ps)[5]; ps = s; ps是一指向二维数组s的指针,ps+1表示指向数组s第2行首地址的指针; *(ps+3)表示数组s第4行的首地址;*(ps+1)+3表示数组s第2行第4列元素的地址,
-
浮点类型在内存中分布为:符号位+指数位(-127~128)+尾数部分 (有效数字 1<= M <2)
-
#include "stdio.h" #include "string.h" void fun(char *s){ char t[7]; s=t; strcpy(s, "example"); } int main(){ char *s; fun(s); printf("%s",s); return 0; }
对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”
-
需要解释的就是编译错误和运行错误,编译错误可以理解成编译器能检查出来的错误,运行错误理解成逻辑错误,需要用户自己纠错
-
1.main函数里的s没有初始化就在fun函数里使用s,编译器会报警告,运行时会报错(局部变量未初始化)。答案选D。
2.就算s初始化了,在fun函数里,局部变量t的大小为7,而strcpy函数会复制example末尾的\0
所以example+'\0’一共8个字节空间,会溢出,程序会崩溃。
3.就算局部变量t的大小足够大,在fun函数运行结束后,局部变量t的内存空间会被释放掉,此时s成为野指针;返回main函数后,也不会输出example。
-
-
定义二维数组时,若第一维不确定第二维确定,则数组必须初始化;初始化后数组中元素个数除以第二维大小,若能整除,则商即第一维大小,若不能整除,则商加上1得到第一维大小;若第一二维全部确定,可以不初始化,默认元素全部为0;不允许第二维不定
- 二维数组的真实含义是,它的第一维就是一组数据的起始地址,第二维就是某组数据中的某个值,a[][3]表达的意思就是二维数组a的每一维都是由3个元素组成的一维数组
-
下面程序段的运行结果是 ( ) 。
char *s = "abcde"; s += 2; printf("%d", s);
- 指针s保存的是字符串的首地址,s+=2后,指向了字符‘c’,格式化输出s就是字符‘c’的地址(十进制形式的地址,%p是十六进制的地址)
-
下面代码的执行结果是()
#include <stdio.h> int main(void) { char *p[] = {"TENCENT", "CAMPUS", "RECRUITING"}; char **pp[] = {p + 2, p + 1, p}; char ***ppp = pp; printf("%s ", **++ppp); printf("%s", *++*++ppp); return 0; }
-
从题干当中,我们可以画出这样的一个图,这样就比较直观的看出了p,pp,ppp都指向哪里了,关键是最后两个printf语句。
(1)printf(“%s”,**++ppp);即,ppp当前所指向的位置,再往下移一个位置,即pp的位置2,而pp的位置2指向的是p的位置2,p的位置2指向的是CAMPUS,所以先输出CAMPUS(2)
printf(“%s”,*++*++ppp);
这个语句等价于printf(“%s”,*++(*++ppp));
所以我们首先看,++ppp,第一个printf语句中ppp已经指向了pp的位置2,所以再往下移一个,指向了pp的位置3,而(*++ppp)则代表pp位置3所指向的内容,即p的位置1(pp的位置3指向的是p的位置1),在此基础上前面再加上一个++,则代表指针p在位置1的基础上再往下移动,即指针p的位置2,而p的位置2所指向的内容是CAMPUS,所以第二行输出的也是CAMPUS。
所以正确答案是:CAMPUS CAMPUS
-
scanf()函数是格式化输入函数,它从标准输入设备(键盘)读取输入的信息
- 输入== 读取、打印到屏幕==写
-
关于C语言中的float,下面哪种说法正确的是 ()
- x的二次方大于等于0,对于float变量x总成立
float 变量加法满足交换律
条件0.9f == 0.9 的值为真
条件9 == 0.9*10 的值为真 - C/C++中浮点数由符号位、阶码和尾数构成,其二进制表示并不直接对应浮点数的大小,因此浮点数类型不能进行位运算,否则编译器报错;所以如果A选项正确,其指的应该是x的二次幂;而不是x与2进行逐位异或…
- B不一定正确。虽然浮点数标准IEEE 754**满足加法和乘法的交换律,不满足加法结合律,**但是C++标准不保证IEEE 754标准的实现,于是C++编译器也不保证浮点数a+b的结果等于b+a
- C、D错误。浮点数存在误差,直接比较大小往往不是预期的结果;通常引入一个比要求精度还要小几个数量级的实数epsilon来帮助比较大小。在我的机器上,精度取1e-8,0.9f == 0.9为假(0.9f是单精度浮点,精度比0.9低):
- x的二次方大于等于0,对于float变量x总成立
-
extern、register、static、auto分别是定义外部变量、寄存器变量、静态变量、自动变量
其中,自动变量(auto)和寄存器变量(register)属于动态存储,调用时临时分配单元;而静态变量(static)和外部变量(extern)属于静态存储,在整个程时都存在.- 故,以下只有在使用时才为该类型变量分配内存的存储类型的是()
- auto和register
- 故,以下只有在使用时才为该类型变量分配内存的存储类型的是()
-
函数原型:指明函数的名字,返回的类型,有几个参数,这几个参数是什么类型,不需要函数体,也**不需要形式参数的名字**,其中用分号作为原型的结束符。
例如:void fun( int );
-
C语言程序能够在不同的操作系统下运行,这说明C语言具有很好的
- 移植性
- 所谓移植性就是在某操作系统下编写的程序能够在其他操作系统下编译运行,而程序几乎不需要进行任何修改。所以选择B。
- 移植性
-
对于下面的代码,说法正确的是____
char* s1 = “Hello world”;
char s2[] = “Hello world”;
s1[2] = ‘E’; // 1
s2[2] = ‘E’; // 2
*(s1 + 2) = ‘E’; // 3
*(s2 + 2) = ‘E’; // 4- “Hello World”在常量区,但s1存储在栈,并且可以做++运算,但*p不可更改,相当于const char *p
- 指针指向字符串时,字符串是常量,存储在常量区,而指针存储在栈区,不能对其操作修改。
- 而对于s2,"Hello world"存储在数组里,在栈区,是可以修改的
-
strlen和str.length()都是求字符串的长度,但strlen( )的参数必须是char*,而 str.length( )是string类对象str调用的成员函数。
-
%3d:输出时表示输出位数少于三位数时前面补0,多于三位数时按实际位数输出。输入时表示只输入三位数,少于三位数以空格补齐。
-
二路归并排序的时间复杂度为()。
- 假设数据区域为[1:n],归的过程,第一次将区间分为[1:n/2]和[n/2+1,n],第二次将两个区间分为四个,总共会进行log2(n)次,总共分为了log2(n)层,每次分区间的时间复杂度为1,则总共归的过程时间复杂度为log2(n),而并的过程会的归的过程分的区间进行排序,是两个有序数组合并的过程,每一层合并的时间复杂度为n,有log2(n)层,所以并的总共复杂度为nlog2(n),而归并的复杂度为nlog2(n)+log2(n),用大O表示法就是nlogn
-
用邻接矩阵存储有n个结点(0,1,…,n)和e条边的有向图 0 ≤ e ≤ n ( n − 1 ) 0\leq e \leq n(n - 1) 0≤e≤n(n−1)。在邻接矩阵中删除结点 i ( 0 ≤ i ≤ n ) i(0 \leq i \leq n) i(0≤i≤n)的时间复杂度是()
-
删除节点B时,在邻接矩阵中需要把指向B的边全部删除,B指向的边也全部删除。
而邻接矩阵表示法由一个顶点表(一维数组),一个边集(邻接矩阵,二维数组)组成。由顶点表查找i,复杂度为O(1),然后查找二维数组i行i列,置i行i列均为0(即删除i节点),复杂度为2*O(n)。
结果为O(n),选择 B。
-
-
回溯法
1)(求解目标)回溯法的求解目标是找出解空间中满足约束条件的一个解或所有解。
2)(搜索方式:深度优先)回溯***搜索整个解空间,当不满条件时,丢弃,继续搜索下一个儿子结点,如果所有儿子结点都不满足,向上回溯到它的父节点。分支限界法
1)(求解目标)分支限界法的目标一般是在满足约束条件的解中找出在某种意义下的最优解,也有找出满足约束条件的一个解。
2)(搜索方式:广度优先)分支限界法以广度优先或以最小损耗优先的方式搜索解空间。-
回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。
-
-
共用体变量可以作结构体的成员,结构体变量也可以作共用体的成员。
- 正确
-
文件指针和位置指针都是随着文件的读写操作在不断改变
- 错,文件指针位置不变
-
任何表达式语句都是表达式加分号结尾
- 正确
-
数组名不能与其他变量名相同
- 正确
-
函数形参的存储单元是动态分配的
- 错误,函数的变量一般是栈区,只要退出函数,系统就会自动回收栈区,而动态分配分配时分配堆区,堆区只能手动回收(free函数)
-
C语言 随机操作只适用于文本文件
- 错误,随机操作文本指的是用seek函数重新定位文件指针进行读写操作,访问数组中的元素也是随机的,知道下标就可以,所以说随机操作不只是针对于文件来讲。
-
全局变量放在static静态区,不是在栈区;stack由编译器自动分配和释放,存放函数的参数值,局部变量
-
heap&stack 区别
1.heap是堆,stack是栈。
2.stack的空间由操作系统(不是编译器)自动静态分配和释放(进站和出栈可控);heap的空间是手动申请和释放的,heap常用new关键字来动态分配(—“内存泄露”—— Memory Leak )。
3.stack空间有限(经常有栈溢出,而不是堆溢出),heap的空间是很大的自由区。
在Java中,
若只是声明一个对象,则先在栈内存中为其分配地址空间,
若再new一下,实例化它,则在堆内存中为其分配地址。
4.举例:
数据类型 变量名;这样定义的东西在栈区。
如:Object a =null; 只在栈内存中分配空间
new 数据类型();或者malloc(长度); 这样定义的东西就在堆区
如:Object b =new Object(); 则在堆内存中分配空间
-
若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为0.
- 此时并未到文件尾部,否则返回非0,因为有数据时返回0
-
文件指针用于指向文件,文件只有被打开后才有对应的文件指针。
-
如果函数定义出现在函数调用之前,可以不必加函数原型声明
- 正确
-
输入操作称为写操作,将输入流中的信息存到内存时,使用写函数。
- 输入是指计算机将数据读取存入内存的过程,即这个过程是读入过程,即读操作,使用读函数
- 类比scanf,计算将用户输入的数据从缓冲区读取出来存入内存;printf,计算机将内存中的数据写到输出设备上即屏幕
- 输入是指计算机将数据读取存入内存的过程,即这个过程是读入过程,即读操作,使用读函数
-
函数返回值的类型是由在定义函数时所指定的函数类型
-
指向数组的指针变量称为数组指针变量。
- 一个数组是由连续的一块内存单元组成的。
- 数组名就是这块连续内存单元的首地址。
- 一个数组也是由各个数组元素(下标变量)组成的。
- 每个数组元素按其类型不同占用几个连续的内存单元。
- 一个指针变量既可以指向一个数组,也可以指向一个数组元素。
一般形式:
类型说明符 *指针变量名。有了指针可以用两种方法访问数组元素:
第一种方法为下标法。
第二种方法为指针法。 -
指针变量可以存放指针(地址)、数值和字符
- 只能存储地址
-
内存中每个存储单元都有一个唯一的地址
- 正确
-
int main () { char arr[2][4]; strcpy (arr[0],"you"); strcpy (arr[1],"me"); arr[0][3]='&'; printf("%s \n",arr); return 0; }
-
因为arr是一个2行4列的二维数组,每一行可以存放最多三个字符的字符串。
执行
strcpy(art[0],"you”)
;后则将字符串"you”放置在数组arr的第一行上,即a[0][0]=’y’,
a[0][1]=’o’,a[0][2]=’u',a[0][3]=’\0’
(字符串结尾符),执行strcpy(arr[1],”me”);
后则将字符串”me”放置在数组arr的第二行上,即
a[1][0]=’m',a[1][1]=’e’,a[1][2]=’\0’
(字符串结尾符),由于二维数组在内存中是以行序存放的,执行
arr[0][3]=’&’;
后,第一行与第二行将视为 一个字符串"you&me”,而数组名则是该字符串的首地址。所以正确答案是"you&me”。
-
-
C库函数中malloc依赖下面哪个系统调用增长堆空间()
-
open
-
ioctl
-
sbrk
-
write
-
open:打开和创建文件; ioctl:设备输入输出操作的系统调用; sbrk:实现虚拟内存到内存的映射; write:将数据写入一个打开的文件。 申请堆空间是使用sbrk,C++是brk()
-
-
malloc函数进行动态、静态内存分配是在什么阶段?
-
程序占用三种类型的内存:静态内存、栈内存、堆内存;
静态内存:
用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量
栈内存:用来保存定义在函数内的非static对象。
分配在静态内存或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁。
堆内存:
在程序运行时分配。动态对象的生存周期由**程序(用户)**来控制。
-
装载阶段、执行阶段
-
-
“-6.2e”的意思:
6 表示输出的位宽,如果结果小于6位,则不足的部分以空格补充,如果超于6位则没影响;
.2 保留两位小数
e 以指数形式输出,即10的n次幂,e+02即表示10^2
- 负号,表示左对齐还是右对齐,2.19e+02 占9位(代码执行测试得到,通过不断修改6的结果,直到改到10,才出现了%6.2e输出时,左侧添加空格占位)。所以 - 表示左对齐,结尾右侧补空格,而+情况是右对齐,即左侧开头补空格
所以对于218.82631输出结果应为2.19*10^2,转换成计算机的代码输出格式即2.19e+02
-
共用体:
- 共用体变量的地址和它的各成员的地址都是同 一地址。
- 不能对共用体变量名赋值。
- 不能企图引用变量 名来得到一个值。
- 不能在定义共用体变量时对它初始化。
- 不能用共用体变量名作为函数参数。
- 不能用函数返回共用体变量
- 可以定义共用体数组,共用体成员可以是数组
- 共用体类型定义和结构体类型定义可以互相嵌套
- 任何时间起作用的是最后一个成员(且只能任意时间只有一个成员起作用)
-
C 语言分隔符:逗号(变量和表达式之间)、分号(for语句内)、空白符(字符串之间)、冒号(case:)
-
变量的类型分为两种:储存和数据
-
所有的数据都有两种类型,一种是数据类型,一种是存储类型。
数据类型:如int,float等
存储类型:四种存储类型的变量,自动变量(auto)、静态变量(static)、外部变量(extern)、以及寄存器变量(register)。 -
存储类别 存储期 作用域 声明方式 auto 自动 块 块内 register 自动 块 块内,使用关键字register static(局部) 静态 块 块内,使用关键字static static(全局) 静态 文件内部 所有函数外,使用关键字static extern 静态 文件外部 所有函数外
-
-
return后面括号里的表达式的值即是此函数的值。请问这句话的说法是正确的吗?
- 错误
- return 后面括号的值不一定是函数的值,譬如函数返回值与return 类型不一致需要类型转换,返回值为 int ,retun 3.2 ,那么肯定会进行转换的
-
!(x + y) + z-1 && y + z/2;
- 表达式的值是
!(x + y) + z-1 && y + z/2即为(( !(x + y) )+ z-1) && (y + z/2)=(!7+5-1)&&(4+2)=(0+5-1)&&6=4&&6=1
-
用C语言编写的代码程序()
-
可立即执行
-
是一个源程序
-
经过编译即可执行
-
经过编译解释才能执行
-
1、【编译】是把c源程序翻译成汇编代码:.s; 2、【汇编】是把汇编代码翻译成二进制目标代码:.obj; 3、【链接】是把多个二进制目标代码文件链接成一个可执行程序;因为一个工程某个文件调用了其他c文件的函数或变量 一个程序需要上面三个步骤才能由源程序变成可执行程序。
-
C语言写的代码程序肯定是源程序 它不能立即执行,必须经过编译成可执行代码
如果这个源程序中不含有main函数,编译后的代码也是不可执行的 C语言不是解释执行的
-
-
在32位机上,下面C程序的输出结果是
struct MyStruct { int i; char c; struct InnerStruct { int i; long l; double d; char c; } innerStruct; }; union MyUnion { int i; char c; }; int main() { printf("%d, %d", sizeof(MyStruct), sizeof(MyUnion)); }
-
做选择题就要有做选择题的方法,除了掌握基本的知识。
对于struct来说,大小虽然要慢慢累加,但是最后必然为struct里最长类型的整数倍,即double为8字节,则肯定是8的整数倍,排除A,B(不用慢慢累加计算)
对于Union来说,就简单了,大小为最长类型的整数倍,即int为4字节,则为4,选C
-
结构体长度并不一定是double的长度8的整数倍,而是min(字节对齐长度,8)的倍数
如果默认编译器4字节对齐,这题就是28,如果是8字节,就是32
设对齐字节数为n(n = 4或8,区别于32位或者64位操作系统),每个成员内存长度为Li, Max(Li)为最大的成员内存长度,字节对齐规则是:
\1. 结构体对象的起始地址能够被Max(Li)所整除;
\2. 结构体中每个成员相对于起始地址的偏移量,即对齐值应是min(n,Li)的倍数.若不满足对齐值的要求,编译器会在成员之间填充若干个字节;
\3. 结构体的总长度值应是min(n,Max(Li))的倍数,若不满足总长度值的要求,编译器在为最后一个成员分配空间后,会在其后填充若干个字节.
-
-
两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数
-
fseek函数一般用于二进制文件。注意也可用于文本文件
-
一个变量的数据类型被强制转换后,它将保持被强制转换后的数据类型
- 错误
-
使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?
-
%-30.4e
-
%4.30e
-
%-30.4f
-
%-4.30f
-
-: 左对齐
30: 最小字段宽度
.4: 精确度保留小数4位
f: double精度浮点数
e: 科学计数法
-
printf中,%f通杀单精度和双精度
在scanf中,%f和%lf才有区别
-
-
下面关于C语言中sizeof(int)说法正确的是()
- 编译时
- 运行时
-
C语言中的一个变量可以被定义为两个或多个不同的类型。请问这句话的说法是正确的吗
- 如果同一个变量,分别作为全局变量和局部变量,根据局部优先原则,是可以定义为不同类型的。
-
struct student { int num, age; }; struct student stu[3] = {{6001, 20}, {6003, 21}, {6005, 19}}; struct student *p = stu;
则下面的C语言表达式中,值为6003的是() 。
-
对于A选项:++(p->num)。表示取数组第一个元素的值(6001),然后+1;
对于B选项:(p++)->num。后缀自增运算符(++)与成员选择运算符(->)处于同一优先级,从左到右结合,但是指针偏移的操作直到表达式结束才会进行,
这个表达式相当于§->num;p=p+1;
对于C选项:
(*p++).num。
后缀自增运算符(++)优先级高于取值运算符(*),但是++直到表达式结束才会进行,这个表达式相当于(*p).num;p=p+1;
对于D选项:
(*++P).num。
前缀自增运算符(++)优先级和取值运算符(*)一样,先执行p=p+1操作,相当于(*(p+1)).num
;
-
-
下列函数正确的是
void test1(){ unsigned char array[MAX_CHAR+1],i; for(i = 0;i <= MAX_CHAR;i++){ array[i] = i; } } char*test2(){ char p[] = "hello world"; return p; } char *p = test2(); void test3(){ char str[10]; str++; *str = '0'; }
- 重点不在于CHAR_MAX的取值是多少,而是在于i的取值范围是多少。 一般char的取值范围是-128到127,而u char 则是0255,所以i的取值范围是0255. 所以当CHAR_MAX常量大于255时,执行i++后,i不能表示256以上的数字,所以导致无限循环。 第二个问题: 重点在于函数中p的身份,他是一个指针,还是数组名; 如果是指针p,则p指向存放字符串常量的地址,返回p则是返回字符串常量地址值,调用函数结束字符串常量不会消失(是常量)。所以返回常量的地址不会出错。 如果是数组p,则函数会将字符串常量的字符逐个复制到p数组里面,返回p则是返回数组p,但是调用函数结束后p被销毁,里面的元素不存在了。 例子中p是数组名,所以会出错,p所指的地址是随机值。 若是把char p[]=“hello”;改成char *p=“hello”;就可以了。第三个问题: 重点在于str++;这实际的语句就是str=str+1;而str是数组名,数组名是常量,所以不能给常量赋值。(可以执行str+1,但是不能str=.)
-
输出正确的是:
#include<stdio.h> int main() { char *a = "Trend"; char **b = &a; *b = "commercial"; char *c = ++a; a = "talents."; printf("%c\n",*++c); return 0; }
- 一开始a指向Trend,b指向指针a,后面commercial的内容赋给了指针b,然后就改变了指针a的内容,a就指向了commercial,指针c指向a所指的第二个字符,也就是o,虽然后面a又指向了talents,但是c已经指向了commercial,所以++c,c就指向了m,*++c就输出m字符
-
在C中使用malloc时不需要强制类型转换,因为在C中从void*到其他类型的指针是自动隐式转换的;
在C++中使用malloc时必须要强制类型转换,否则会报错,但在c++中一般用new而不用malloc;
-
int a[10]={ }; 编译器自动将所有元素置零
-
对于以下结构定义,(*p)->str++中的++加在()
struct { int len; char *str; } *p;
- p是指针,可以写p->str,但是
(*p)
只能写(*p).str;
- p是指针,可以写p->str,但是
-
结构体和共用体变量都不能进行比较操作,因为类型不一样,无法比较,除非强制转换或重载比较运算符
-
如果想在一个地方定义结构体,而在其他地方定义实际的结构体变量那么就必须使用标记名;如果定义结构体的同时就创建该结构体变量,则可以省略结构体的标记名,此时该结构体是一次性的、
-
typedef不是用来定义新的数据类型,而是创建易于记忆的类型名,给类型取别名
-
结构总是以传值的方式传递给函数
指针c指向a所指的第二个字符,也就是o,虽然后面a又指向了talents,但是c已经指向了commercial,所以++c,c就指向了m,*++c就输出m字符
-
在C中使用malloc时不需要强制类型转换,因为在C中从void*到其他类型的指针是自动隐式转换的;
在C++中使用malloc时必须要强制类型转换,否则会报错,但在c++中一般用new而不用malloc;
-
int a[10]={ }; 编译器自动将所有元素置零
-
对于以下结构定义,(*p)->str++中的++加在()
struct { int len; char *str; } *p;
- p是指针,可以写p->str,但是
(*p)
只能写(*p).str;
- p是指针,可以写p->str,但是
-
结构体和共用体变量都不能进行比较操作,因为类型不一样,无法比较,除非强制转换或重载比较运算符
-
如果想在一个地方定义结构体,而在其他地方定义实际的结构体变量那么就必须使用标记名;如果定义结构体的同时就创建该结构体变量,则可以省略结构体的标记名,此时该结构体是一次性的、
-
typedef不是用来定义新的数据类型,而是创建易于记忆的类型名,给类型取别名
-
结构总是以传值的方式传递给函数