可能的重复:
char * const和const char *有什么区别?
const char * const vs const char *?
当我们在c中定义一个函数时,我们可以使用(const char * str),(char const * str)或(char * const str)作为变量。它们之间有什么区别?
我写了这段代码
#include <stdio.h>
int main() {
int b = 15;
const int *foo = &b;
//b = 20;
*foo = 20;
printf("%d", *foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这意味着foo指向的位置无法更改.这意味着b无法改变.但是当我取消注释时b = 20.它没有显示任何错误,我得到了输出20.在这段代码中我得到了这个错误
main.c: In function 'main':
main.c:15:10: error: assignment of read-only location '*foo'
*foo = 20;
Run Code Online (Sandbox Code Playgroud)
如果*foo那是b只读位置,为什么我可以改变它的值b = 20?
考虑2个片段:
using x = int*;
int main () {
const x a = new int(3);
*a = 5;
}
Run Code Online (Sandbox Code Playgroud)
和
int main () {
const int* a = new int(3);
*a = 5;
}
Run Code Online (Sandbox Code Playgroud)
第一个编译,而第二个没编译
- > using不等于简单地"插入"类型然后解析该行.
using直接使用和"内联"类型之间是否存在更多差异?
我正在阅读Googletest doc,我知道有一种比较字符串的语法,另一种用于比较C字符串.我没有看到什么被称为C字符串和字符串.这些有何不同?
通过声明
const int i;
Run Code Online (Sandbox Code Playgroud)
很明显,i无法修改.
那么为什么宣言呢
void f (const int *p)
Run Code Online (Sandbox Code Playgroud)
正在修改p?(我测试了它,它正在修改,p但不知道如何?).
是否有可能确定字符串是否不能写在传递给它的那一边char * string?
我的代码:
#include <stdio.h>
typedef enum string_type
{ READ_ONLY, READ_WRITE }
String_type;
String_type isvalid(char *s);
void test(char *s){
if(isvalid(s))
printf("OK\n");
else
printf("NG\n");
}
int main(void){
char data_str[] = "data_str";
test("data_str");// fails
test(data_str);// works
return 0;
}
String_type isvalid(char *s){
//Can it be determined by this?
//I don't think this is a portable way.
return (void *)s > (void *)main ? READ_ONLY : READ_WRITE;
}
Run Code Online (Sandbox Code Playgroud) 首先,这不是重复的,因为之前问过同样的错误问题,但在不同的上下文中
代码
#include<iostream>
#include<cstring>
int main()
{
const char *s1;
const char *s2="bonapart";
s1=new char[strlen(s2)+1];
strcpy(s1,s2);
std::cout<<s1;
}
Run Code Online (Sandbox Code Playgroud)
输出
[Error] invalid conversion from 'const char*' to 'char*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
为什么会出现这样的错误?
如果我取代const char *s1由char *s1 编译罚款。但我认为这const只是说 s1 指向常量字符串意味着我们不能修改它所指向的字符串。这并不意味着它s1是常数 ptr。请对此有所了解。
在下面的程序中,p被声明为一个指针(它是常量BUT字符串不是).但程序仍然无法工作并突然停止说"untitled2.exe已停止工作".
#include<stdio.h>
#include<stdlib.h>
int main(){
char * const p = "hello";
*p = 'm';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种意外
我有以下代码:
const char * func_journey ()
{
const char * manner = "Hello";
manner = "World";
return manner;
}
int main()
{
const char * Temp;
Temp = func_journey();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在调试中运行它只是为了看看会发生什么,某种方式从"Hello"变为"World"并且指针也发生了变化,因为我已经将它声明为const.
另一件事是,在运行结束时Temp是"世界",现在又怎么样?方式是func_journey里面的一个自动变量,它不应该在最后被破坏吗?
非常感谢.
标题说明了一切。如何更改常数的值?这是否与更改常量数组的索引X处的元素的值相同?
#include<iostream>
int main(){
const char* y = "original";
auto *p = &y;
*p = "modified";
std::cout<<y<<"\n";
//outputs modified
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 这些声明是不同的还是产生相同的结果?
char * const *argv;
Run Code Online (Sandbox Code Playgroud)
和
const char **argv;
Run Code Online (Sandbox Code Playgroud)
是否存在差异或指针指针?
背景是我正在编写一个C命令行shell并将此结构用于命令:
struct command
{
char * const *argv;
};
Run Code Online (Sandbox Code Playgroud)
上面的结构用于调用exec.现在,当我查看另一个问题时,结构是不同的:
在那个问题中,实现相同的结构是不同的.