在小端机器中,下面代码输出的结果是:( )
#include <stdio.h> int main() { int a = 0x11223344; char *pc = (char*)&a; *pc = 0; printf("%x\n", a); return 0; }
假设,a变量的地址为0x64,则a变量在内存中的模型为:
0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |
char*类型的指针变量pc指向只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char*类型。
char *pc = (char*)&a; pc实际指向的是整形变量a的空间,即pc的内容为0x64,即44,
*pc=0,即将44位置中内容改为0,修改完成之后,a中内容为:0x11223300
因此:选择C
下列程序段的输出结果为()
unsigned long pulArray[] = {6,7,8,9,10}; unsigned long *pulPtr; pulPtr = pulArray; *(pulPtr + 3) += 3; printf("%d,%d\n",*pulPtr, *(pulPtr + 3));
unsigned long pulArray[] = {6,7,8,9,10};
unsigned long *pulPtr;
pulPtr = pulArray; // 数组名代表数组首元素地址,因此pulptr指向的是数组中第一个元素的位置
*(pulPtr + 3) += 3; // pulptr+3访问的是数组中第三个元素(数组下标从0开始),故将9改为9+3=12
printf("%d,%d\n",*pulPtr, *(pulPtr + 3)); // 打印第一个和第三个元素,因此:打印6和12
选C
以下哪个操作可以避免野指针的出现?
ABCD都对
下面关于assert宏的描述哪个是正确的?
答案是B.assert宏仅在调试模式下起作用。
assert宏在程序编译的时候通常是被禁用的,当编译选项中加入"-DNDEBUG"时,assert宏就会被禁用,因此assert宏仅在调试模式下起作用。当assert宏的表达式结果为false时,程序会终止执行。assert宏可以用于任何类型的表达式,不仅仅限于整数类型。
下面关于"指针"的描述不正确的是()
A选项目前还没学,目前只需要了解free不会更改指针的指向。
B选项强调了32位系统,所以没问题。
CD选项是定义本身。
所以排除法也可以确定是A。
下面代码的执行结果是( )
str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4,故选C。
字符串左旋结果
void rotate(char* str,int n,int sz,char* arr) { int i = 0, j = 0; for (i = n; i < sz; i++) { arr[j] = str[i]; j++; } if (n > 0) { for (i = 0; i < n; i++) { arr[j] = str[i]; j++; } } for (i = 0; i < sz; i++) { printf("%c", arr[i]); } } int main() { char str[100] = " "; int n = 0, i = 0; char arr[100] = "";; printf("请输入一串字符串:"); while ((str[i] = getchar()) != '\n') { i++; } str[i] = 0; int sz = i; printf("请输入你要左旋的个数"); scanf("%d", &n); rotate(str, n, sz,arr); return 0; }