0%

C++刷题8.11

C++8.11

常量指针

下面指针所指向的内存,可以修改的是()

A const int* a

B int const* b

C int* const c

D const int* const d

A 和 B 是等价的。const int* aint const* b 都表示一个指向常量整数的指针。你可以改变这个指针所指向的地址,但不能通过这个指针来改变地址处的值。

D const int* const d 表示一个指向常量整数的常量指针。你既不能改变这个指针所指向的地址,也不能通过这个指针来改变地址处的值。

C int* const c 表示一个指向整数的常量指针。这个指针的值(即它指向的地址)不能改变,但是你可以改变这个地址处的值。

 

define宏定义

宏定义只是替换

下面程序输出的是:

#define f(x) x*x
main (){ 
    int a=5,b=2,c;
    c=f(a)/f(b);
    printf("%d",c);
}

这题注意乘除法,/不要代入数学里的分号了,是按顺序算的。

所以答案是24

 

地址相减

原来我一直以为地址值本身不能做到相减这个操作的,但其实是可以的,不过结果的差值要除以sizeof(类型)

参考指针的++或者--运算,都是指针的步长乘以一个移动的步长,再除以一个指针的步长

int a[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int *p, *q;
p = a;
q = &a[2];

答案是2

 

strlen()

坑!全是坑,题做的有高考一轮复习内味了

int main() { 
  char a[7] = "a0\0a0\0";
  int i, j;
  i = sizeof(a); 
  j = strlen(a);
  printf("%d %d\n",i, j);
}

strlen()到\0会停下,你就坑吧!

7 2

 

加法操作符重载

如果表达式++a中的"++"是作为成员函数重载的运算符,若运用运算符函数调用格式,则可表示为()

A a.operator++(1)

B operator++(a)

C operator++(a,1)

D a.operator++()

答案是D

乱七八糟的解析

当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:

(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

(2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

(3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

 

不如先直接记:重载前缀:a.operator++(); 重载后缀:a.operator++(1)

 

运算符重载

下面运算符不能被重载的是()

A 做用域运算符“::”

B 对象成员运算符“.”

C 指针成员运算符“->”

D 三目运算符“? :”

答案:ABD

似乎有方法说“带点的都不能重载

不过还是看图吧

 

数组、指针与函数

#include <stdio.h>
#include <stdlib.h>
void fun(int *p1, int *p2, int *s) {
    s = (int *)malloc(sizeof(int));
    *s = *p1 + *(p2++);
}
int main() {
    int a[2] = {1, 2}, b[2] = {10, 20}, *s = a;
    fun(a, b, s);
    printf("%d \n", *s);
}

这个题对于我这个唐b来说很有价值,因为它包含了非常多有关指针的操作。

首先是函数传递

fun()函数定义了局部变量p1与p2与s,如果这个局部变量是指针,那么他们会和上一级函数中的对应变量指针指向同一位置,就像这里p1与s,在上一级中s已经指向了数组a的第一个位置,所以说p1、s指向的都是一个位置,这是第一个给我给我蒙住的地方。

然后是自增

fun()函数内p2的自增是后缀,先赋值再自增,尽管这个是我为数不多已经知道的点,但面对这么一个大体量题目还是给我晃倒了。

再者是malloc函数的返回值

malloc函数返回的是新内存地址的指针,所以在fun()函数内部,经过malloc的“洗礼”之后地址遭到改变,s指向也变了,于是乎函数内部的这个“s”和上一级函数中s的指向就变得不一样了,也就不能对之前指向的目标进行操作了,所以程序输出的仍是1

所以如果注释掉malloc,结果就是11了

 

逗号表达式

这个就多少带点离谱了

a=3*5 , a *4;(空格是防止markdown语句)

这样一行表达式,a肯定最终为15

但如果b=(a=3*5,a *4)

那么最终b的值就是60

逗号表达式,依次计算,整体的值为最后结果