//以下代码输出12、//3行4列
#include <iostream>
int main()
{
double alpha[][4] = { {0}, {1,2}, {3,4,5} };
//double alpha[][4] = { {0}, {1,2}, {3,4,5} };//编译有错:incomplete element type
std::cout << sizeof(alpha) / sizeof(double);
return 0;
}
选择正确的语句:
void Test()
{
1:--------------------------------
sprintf(pBuf, "%s", "This is a test.\n");
printf("%s", pBuf);
2:--------------------------------
}
a. 1:char *pBuf = new char [20]; 2:delete[] pBuf;
b. 1:char *pBuf = new char (20); 2:delete pBuf;
c. 1:char *pBuf = (char *)malloc(20); 2:delete[] pBuf;
d. 1:char *pBuf = (char *)malloc(20); 2:delete pBuf;
参考答案A
char *lpc = new char('a'); //开辟一个内存单元,并用括号里的初始化
char *Lpcc = new char[15]; //开辟一个数组
示例:
new char(10) 这个用10来初始化你定义的指针所指向的那个char
new char[10] 定义了一个有10个char元素的数组
释放内存的方法也不一样:
delete lpc;
delete [] lpcc;
参考资料
https://blog.csdn.net/qq_22642239/article/details/85230914+
有一个char*类型的指针,恰好指向了一个int,想让这个指针跳过int指向下一个char,下面的代码可以达到这个目的是:
A: ((int *)p)++;
B : p += sizeof(int);
答案为:B,A已经强制转化为int类型指针,但是最好还是需要char*,所以错了。
实际测试结果为
int main()
{
char * p = "wahaha";
printf("%p\n", p); // 006E8BDC
// ((int *)p)++; // compile error
// Assignment to cast is illegal, lvalue casts are not supported.
int *q = (int *)p;
q++;
printf("%p\n", q); // 006E8BE0
p += sizeof(int);
printf("%p\n", p); // 006E8BE0
}
int main()
{
int a[5]={1,3,5,7,9};
char * p;
p = (char*)a;
p += sizeof(int);
printf("%p %p\n", a, p); // 012FF850 012FF854
int * q;
q = (int*)a;
q++;
printf("%p %p\n", a, q); // 012FF850 012FF854
char * r;
r = (char*)a;
//((int *)r)++; // compile error
// Assignment to cast is illegal, lvalue casts are not supported.
printf("%p %p\n", a, r); // 012FF850 012FF850
return 0;
}
*p++
int main()
{
int a[5]={1,3,5,7,9};
int *p;
int x;
a[0]=1;a[1]=3;
p = a;
x = *p++;
cout << x << endl; // 1
cout << *p << endl; // 3
for (int i = 0; i < 5; i++) cout << a[i] << " "; // 1 3 5 7 9
cout << endl;
a[0]=1;a[1]=3;
p = a;
x = (*p)++;
cout << x << endl; // 1
cout << *p << endl; // 2
for (int i = 0; i < 5; i++) cout << a[i] << " "; // 2 3 5 7 9
cout << endl;
a[0]=1;a[1]=3;
p = a;
x = *(p++);
cout << x << endl; // 1
cout << *p << endl; // 3
for (int i = 0; i < 5; i++) cout << a[i] << " "; // 1 3 5 7 9
cout << endl;
int x = 3, y;
int *px = &x;
y = *px++;
cout << x << " " << y << endl; // 3 3
cout << px << " " << &x << endl; // 00BBF7AC 00BBF7A8
return 0;
}
因为++运算符优先级高于*,所以*p++等于*(p++),
*p++:等同于*p; p++。p指向的值不变,p地址本身++
(*p)++等于*p, (*p)++。p指向的值++,p地址本身不变。
解析:由于*和++的运算优先级一样,且是右结合。故*p++相当于*(p++),p先与++结合,然后p++整体再与*结合。前面陈述是一种最常见的错误,很多初学者也是这么理解的。但是,因为++后置的时候,本身含义就是先运算后增加1(运算指的是p++作为一个整体与前面的*进行运算;增加1指的是p+1),所以实际上*p++符号整体对外表现的值是*p的值,运算完成后p再加1.
【注意】是运算后p再加1,而不是p所指向的变量*p再加1