对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()
0<=rand()%(n-m+1)<=n-m
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(*a)); //4 对首元素的地址进行解引用取到首元素的值,为int型
printf("%d\n", sizeof(a + 1)); //4 sizeof(&a[1])
printf("%d\n", sizeof(a[1])); //4 数组的每个元素都是整型
printf("%d\n", sizeof(&a)); //4 取到整个数组的地址(地址为四个字节存储)
printf("%d\n", sizeof(&a + 1)); //4 地址的大小为四个字节
printf("%d\n", sizeof(&a[0])); //4 地址的大小为四个字节
printf("%d\n", sizeof(&a[0] + 1)); //4 地址的大小为四个字节
printf("%d\n", sizeof(*&a)); //16 &a取到整个数组的地址,再解引用取到整个数组
指针即为地址 一般是32位系统,所以是4个字节
函数重载不需要是成员函数,在类外声明或定义的函数同样可以对其进行重载
错题:
void Func(char str_arg[100])
{
printf("%d\n",sizeof(str_arg));
}
int main(void)
{
char str[]="Hello";
printf("%d\n",sizeof(str));
printf("%d\n",strlen(str));
char*p=str;
printf("%d\n",sizeof(p));
Func(str);
}
牛客网:6 5 4 4
解析:
- str是复合类型数组char[6],维度6是其类型的一部分,sizeof取其 维度*sizeof(char),故为6;
- strlen 求c类型string 的长度,不含尾部的'\0',故为5;
- p只是个指针,32位机上为4;
- c++中不允许隐式的数组拷贝,所以Func的参数会被隐式地转为char*,故为4;
错题:
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = reinterpret_cast<int *>(p);
p1++;
p = reinterpret_cast<char *>(p1);
printf("result is %s\n", p);
答案:result is to test something
该题的关键是要认清楚强制类型转换后指针的类型。
p的类型为char *,p++后p指向str数组的第2个元素即字母“l”的位置。
p1的类型为int *,p1++后p1指向的位置增加4个字节,指向str数组中的第6个元素即字母“t”的位置。
因此最后p的内容为“to test something”。
错题:
C c;
void main()
{