常量指针
下面指针所指向的内存,可以修改的是()
A const int* a
B int const* b
C int* const c
D const int* const d
A 和 B 是等价的。const int* a
和 int 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
逗号表达式,依次计算,整体的值为最后结果