我不确定这是否是一个正确的编程问题,但它总是困扰我,我想知道我是否是唯一的.
在最初学习C++时,我理解了引用的概念,但指针让我感到困惑.你为什么问?因为你如何声明一个指针.
考虑以下:
void foo(int* bar)
{
}
int main()
{
int x = 5;
int* y = NULL;
y = &x;
*y = 15;
foo(y);
}
Run Code Online (Sandbox Code Playgroud)
该函数foo(int*)将int指针作为参数.由于我已经声明y为int指针,我可以传递y给foo,但是当我第一次学习C++时,我将*符号与解除引用相关联,因此我认为int需要传递一个解引用.我会试图通过*y进入foo,这显然是行不通的.
用一个单独的运算符来声明指针会不会更容易?(或用于解除引用).例如:
void test(int@ x)
{
}
Run Code Online (Sandbox Code Playgroud) 我有一个结构定义为:
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
Run Code Online (Sandbox Code Playgroud)
以及指向这些结构的指针数组:
struct stasher_file *files[TOTAL_STORAGE_SIZE];
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我正在指向结构并设置其成员,并将其添加到数组中:
...
struct stasher_file *newFile;
strncpy(newFile->name, name, 32);
newFile->size = size;
newFile->start = first_free;
newFile->popularity = 0;
files[num_files] = newFile;
...
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误:取消引用指向不完整类型的指针
每当我试图访问里面的成员newFile.我究竟做错了什么?
我想不出函数调用中多个星号的任何实际用法:
void foo(int a, char b)
{
}
int main(void)
{
(**************foo)(45, 'c');
//or with pointer to function:
void (*ptr)(int, char) = foo;
(******ptr)(32, 'a');
}
Run Code Online (Sandbox Code Playgroud)
为什么在C和C++中都允许这个东西?
我正在努力使用指针符号*,我发现它在声明和表达式中的使用方式非常混乱.
例如:
int *i; // i is a pointer to an int
Run Code Online (Sandbox Code Playgroud)
但是语法背后的逻辑是什么?*之前的*是什么意思?我们来看下面的例子.请纠正我错在哪里:
char **s;
char *(*s); // added parentheses to highlight precedence
Run Code Online (Sandbox Code Playgroud)
这就是我失去轨道的地方.parantheses之间的*s意味着:s是一个指针?但指针是什么?括号外的*是什么意思:指向s指向的指针?
所以这个意思是:指向s指向的指针是指向char的指针?
我不知所措.*符号在声明和表达式中的解释是否不同?如果是这样,它的解释方式有何不同?我哪里错了?
例如,
class Person{
string name;
public:
T& operator*(){
return name;
}
bool operator==(const Person &rhs){
return this->name == rhs.name;
}
bool operator!=(const Person &rhs){
return !(*this == rhs); // Will *this be the string name or the Person?
}
}
Run Code Online (Sandbox Code Playgroud)
如果*this最终提领this的string,而不是一个Person,是有维持的使用一种解决方法*作为类外引用操作?
如果我*不放弃而不放弃使用,那将是一个很大的障碍*this.
快速而简单的问题.我有点理解命名空间别名限定符的作用,它用于访问命名空间中的成员,但解除引用操作符也是如此.我对这种情况的不同感到困惑,为什么你会使用一个而不是另一个,或者他们各自如何完成同样的事情.
using colAlias = System.Collections;
namespace myns
{
class TestApp
{
static void Main()
{
colAlias.Hashtable test = new colAlias.Hashtable();
colAlias::Hashtable test1 = new colAlias::Hashtable();
}
}
}
Run Code Online (Sandbox Code Playgroud) 来自Rust指南:
要取消引用(获取引用的值而不是引用本身)
y,我们使用星号(*)
所以我做到了:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, *ptr_y);
}
Run Code Online (Sandbox Code Playgroud)
即使没有明确的解引用,这也给了我相同的结果(x = 1; y = 1):
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, ptr_y);
}
Run Code Online (Sandbox Code Playgroud)
为什么?不应该ptr_y打印内存地址并*ptr_y打印1?是否有某种自动解除引用或者我错过了什么?
在Delphi/Free Pascal中:是一个运算符还是它只是表示一个指针类型?
program Project1;
{$APPTYPE CONSOLE}
var
P: ^Integer;
begin
New(P);
P^ := 20;
writeln(P^); // How do I read this statement aloud? P is a pointer?
Dispose(P);
readln;
end
Run Code Online (Sandbox Code Playgroud) 我经常使用newtype模式,但我厌倦了写作my_type.0.call_to_whatever(...).我很想实现这个Deref特性,因为它允许编写更简单的代码,因为我可以使用我的newtype,好像它在某些情况下是底层类型,例如:
use std::ops::Deref;
type Underlying = [i32; 256];
struct MyArray(Underlying);
impl Deref for MyArray {
type Target = Underlying;
fn deref(&self) -> &Self::Target {
&self.0
}
}
fn main() {
let my_array = MyArray([0; 256]);
println!("{}", my_array[0]); // I can use my_array just like a regular array
}
Run Code Online (Sandbox Code Playgroud)
这是一种好的还是坏的做法?为什么?可能是什么缺点?