我总是搞砸了怎么用const int*,const int * const和int const *正确的.是否有一套规则来定义您能做什么和不能做什么?
我想知道在任务,传递到职能等方面所做的所有事情和所有不应做的事情.
有什么区别
char* name
Run Code Online (Sandbox Code Playgroud)
它指向一个常量字符串文字,和
const char* name
Run Code Online (Sandbox Code Playgroud) 以下声明之间有什么区别?
char * const a;
const char * a;
Run Code Online (Sandbox Code Playgroud)
为了理解我写这个小程序的区别:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char a = 'x';
char b = 'y';
char * const pc1 = &a;
const char * pc2 = &a;
printf ("Before\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", *pc1);
printf ("pc2=%p\n", pc2);
printf ("*pc2=%c\n", *pc2);
*pc1 = b;
/* pc1 = &b; */
/* *pc2 = b; */
pc2 = &b;
printf ("\n\n");
printf ("After\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", …Run Code Online (Sandbox Code Playgroud) C++ 11标准(ISO/IEC 14882:2011)在§ C.1.1:
char* p = "abc"; // valid in C, invalid in C++
Run Code Online (Sandbox Code Playgroud)
对于C++来说,没关系,因为指向String Literal的指针是有害的,因为任何修改它的尝试都会导致崩溃.但为什么它在C中有效?
C++ 11还说:
char* p = (char*)"abc"; // OK: cast added
Run Code Online (Sandbox Code Playgroud)
这意味着如果将强制转换添加到第一个语句,它将变为有效.
为什么转换使第二个语句在C++中有效?它与第一个语句有什么不同?它不是仍然有害吗?如果是这样的话,为什么标准说它没关系?
首先,你可能知道const可以用来制作一个对象的数据或一个不可修改的指针或两者兼而有之.
const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer
Run Code Online (Sandbox Code Playgroud)
但是您也可以使用以下语法:
Object const *obj; // same as const Object* obj;
Run Code Online (Sandbox Code Playgroud)
唯一重要的是你把const关键字放在星号的哪一边.我个人更喜欢把const上式的左边指定它的数据是不可修改的,因为我觉得它读取我的左到右的心态更好,但其语法是先?
更重要的是,为什么有两种正确的const数据指定方式,如果有的话,你会更喜欢或需要哪种方式?
编辑:
所以听起来这是一个武断的决定,因为编译器应该如何解释事物的标准早在我出生之前起草了.因为const应用于关键字左侧的内容(默认情况下?)我猜他们认为添加"快捷方式"以应用关键字并以其他方式输入限定符至少直到声明更改为止时没有任何损害解析*或&...
这是C的情况,然后我假设?
我想知道它们之间的区别
const int* ptr;
Run Code Online (Sandbox Code Playgroud)
和
int * const ptr;
Run Code Online (Sandbox Code Playgroud)
以及它是如何工作的.
我很难理解或记住这一点.请帮忙.
快速提问:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Run Code Online (Sandbox Code Playgroud)
这两个功能在每个方面都是相同的还是有区别的?我对C语言的答案感兴趣,但如果C++语言中有一些有趣的东西,我也想知道.
我正在运行一些示例程序来重新熟悉C++,我遇到了以下问题.首先,这是示例代码:
void print_string(const char * the_string)
{
cout << the_string << endl;
}
int main () {
print_string("What's up?");
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,print_string的参数可能已经改为const char * const the_string.哪个更合适呢?
我理解不同之处在于,一个是指向常量字符的指针,而另一个是指向常量字符的常量指针.但为什么这两个都有效呢?什么时候相关?
我经常使用const对象的指针,就像这样......
const int *p;
Run Code Online (Sandbox Code Playgroud)
这只是意味着您无法更改p指向的整数p.但是我也看到了const指针的引用,这样宣称......
int* const p;
Run Code Online (Sandbox Code Playgroud)
据我所知,这意味着指针变量本身是不变的 - 你可以改变它整天指向的整数,但你不能指出其他东西.
有什么可能的用途?
为什么C中的以下代码有效?
const char* str = NULL;
str = "test";
str = "test2";
Run Code Online (Sandbox Code Playgroud)
由于str是指向常量字符的指针,为什么我们允许为它分配不同的字符串文字?此外,我们如何保护str不被修改?看起来这可能是一个问题,例如,我们后来将str分配给一个更长的字符串,最后写入另一部分内存.
我应该补充一点,在我的测试中,我在每个作业之前和之后打印出str的内存地址,但它从未改变过.因此,尽管str是指向const char的指针,但内存实际上正在被修改.我想知道这可能是C的遗留问题吗?