Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义char和int时指针有什么区别?_C++_Pointers - Fatal编程技术网

C++ 定义char和int时指针有什么区别?

C++ 定义char和int时指针有什么区别?,c++,pointers,C++,Pointers,我理解指针工作的基本原理,但下面的例子让我感到困惑 int *myNum = 10; // Produces an error char *myChar = "Something"; // Works fine 为什么分配字符有效,而整数无效(可能是因为字符被视为数组) 还有什么让我困惑的是,当直接分配指针变量时,它会自动获得地址吗 char *myChar = "Something"; 及 这里的区别是什么,或者等于什么?这是同一件事(编译器没有魔法发生)。默认情况下,像10这样的文字是

我理解指针工作的基本原理,但下面的例子让我感到困惑

int *myNum = 10; // Produces an error

char *myChar = "Something"; // Works fine
为什么分配字符有效,而整数无效(可能是因为字符被视为数组)

还有什么让我困惑的是,当直接分配指针变量时,它会自动获得地址吗

char *myChar = "Something";

这里的区别是什么,或者等于什么?

这是同一件事(编译器没有魔法发生)。默认情况下,像10这样的文字是int值,而不是int*

你需要投:

int *myNum = (int*)10; // Need to cast
char *myChar = "Something"; // No need to cast "..." is already a char*
请注意,像这样引用指向绝对值的指针是很危险的,因为最终会在CPU内存中找到地址10

关于第二个问题,“…”在内存中被视为一个连续的字符序列,类似于array,相当于char*


要深入了解C、指针以及数组和指针之间的差异,您应该阅读以下内容:Peter van der Linden的《专家C编程:深层C秘密》。

当您执行
char*myChar=“Something”,则在内存中的某个位置创建一个以空字符结尾的只读字符串文字。这是编译器的一个特殊之处,它将连续存储的以空字符结尾的“char”变量块解释为字符串。基本上,您创建了一个字符数组,当您执行
*myChar*
时,它返回字符串

对于整数或任何其他数据类型,它区分作为指向整数的指针的
int*ptr
和作为整数的
int ptr
。您可能收到错误,因为您输入的地址可能对您无效/可用

还有,做什么

char myChar = "Something";  //this is an error, since char can hold one character
char *charAddr = &myChar;
请注意,
myChar
&myChar
是相同的,因为
myChar
是一个指针

编辑:请参阅此处有关字符串文字的内容:

虽然理论上第一个
int*myNum=10
是有意义的,特别是如果您知道地址10处有一个有用的
int
,通常它很少有用,而且可能相当危险

但是,有一些指针分配被广泛使用且非常安全:

int *myNum = 0;
在99.9%以上的现代CPU体系结构上,这与

int *myNum = NULL;
请参见
中的NULL定义

作为一般规则,指针变量的赋值最好通过设置其他对象的地址来完成

int k, *p = &k;
为什么分配字符有效,而整数无效(可能是因为字符被视为数组)

您是对的,
“Something”
是一个字符串文本,可以被视为字符数组。在
char*myChar=“某物”之后发生以下情况:它被分配了长度+1字节的内存,其中将存储
“Something”
myChar
指向该内存的起始地址。字符串文字有点特殊

以下是使用常量值初始化数组的一般方法:

// valid initializations;
char s2[] = { 'a', 'b', 'c' };
int a[] = { 1, 2, 3 };
char s1[] = "123";
还有什么让我困惑的是,当直接分配指针变量时,它会自动获得地址吗

char *myChar = "Something";

看看

基本上是以下的缩写:

static const char some_hidden_array[] = {'S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', '\0'};
some_hidden_array
也就是说,当您编写
“Something”
时,编译器会在后台生成一个数组,并为您提供指向该数组开头的指针。因为这已经是一个指向字符的指针,所以将其分配给类型为“指向字符的指针”(写为
char*
)的变量不会有问题

不是任何类似事物的缩写。它只是数字10——它不是指向包含数字10的数组的指针,或者类似的东西

请注意,
char
是单个字符,而不是字符串,这就是为什么字符串语法与大多数其他类型相比是不寻常的-字符串是多个字符,而不仅仅是一个字符。如果您尝试使用普通的
字符
,您将看到相同的结果:

char *myChar = 'a'; // error
或对于任何其他类型:

float *myFloat = 42.1f; // error

换句话说,
10
给出一个错误并不奇怪,如果有什么问题的话,
“某物”
没有,这也很奇怪。(至少,在你知道字符串文字是如何工作的之前,这是很奇怪的)

谢谢!至于第二个问题,我的意思是如果这两个相等?第一个示例是获取地址的较短方法吗?谢谢如果回答了您的问题,请记住选择此作为您接受的答案。
“…”
不是
字符*
。我不推荐C书来学习C++;习语完全不同。@J.Doe不,第二个例子根本不起作用。字符串文字不是
char
,而是
char[]
。改变这一点,获取
char[]
的地址将为您提供指向指针的指针—在本例中,是指向堆栈变量的指针,因此仅在范围退出之前定义。这非常重要,因为字符串文字有点神奇——它们看起来是“本地的”,但实际上没有作用域;原始指针在任何地方都是有效的,指向指针的指针不是。感谢您的解释,type*var=something是否总是在内存中创建只读变量?至于第二个问题,我的意思是,如果这两个是相等的(较短的方式):)谢谢@是的。看看这个:谢谢,这确实很有帮助。@J.Doe no,
type*var=something
不会创建只读变量。只有字符串literal
“Something”
是只读的(它不是变量),谢谢!嗯,基本上,int*myNum=10//指向地址“10”的指针,而不是包含值为10的变量int的地址?
int*myNum=0
int*myNum=NULL相同在所有系统上。它生成一个空指针。您正在混淆一个事实,即空指针可能不是由所有位零表示的(这与此代码没有区别)@J.Doe Yes,您的困惑正是为什么需要添加显式转换来进行此编译-这几乎总是一个问题
char *myChar = 'a'; // error
float *myFloat = 42.1f; // error