我很擅长使用C++.我以前处理过Java和ActionScript,但现在我想学习这种强大的语言.由于C++授予程序员显式使用指针的能力,因此我对使用箭头成员运算符感到困惑.这是我尝试编写的示例代码.
main.cpp中:
#include <iostream>
#include "Arrow.h"
using namespace std;
int main()
{
Arrow object;
Arrow *pter = &object;
object.printCrap(); //Using Dot Access
pter->printCrap(); //Using Arrow Member Operator
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Arrow.cpp
#include <iostream>
#include "Arrow.h"
using namespace std;
Arrow::Arrow()
{
}
void Arrow::printCrap(){
cout << "Steak!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,它所做的只是使用两种方法(Dot和Arrow)打印牛排.
简而言之,在使用C++编写真正的实际应用程序时,何时使用箭头符号?由于我以前的编程经验,我习惯使用点符号,但箭头对我来说是全新的.
如果我们输入
MyObject *obj = [[MyObject alloc] init];
Run Code Online (Sandbox Code Playgroud)
"obj"是指向内存地址的指针.
...当我们创建一个int时,我们输入:
int x = 10;
Run Code Online (Sandbox Code Playgroud)
我们为什么不打字?
int *x = 10;
Run Code Online (Sandbox Code Playgroud)
问题是,为什么我们需要一个指向对象的指针而不是int,float等...
可能的重复:
为什么使用指针?
将可修改的参数传递给c ++函数
为什么我想要指针参数?我能看到的唯一原因是小功能试图减少混淆和更小的内存占用.
我来自C#,我正在学习C++(使用本教程)所以我对内存有相对无足轻重的知识,但我在指针中看到的唯一用途是"节省空间"并迭代数组.那么为什么像函数这样的scanf函数将指针作为参数呢?例如:
printf("What's your name?: ");
然后:
scanf("%s",&userName).将变量本身作为参数传递会不会更有意义?我正在看的C书说,使用变量本身会产生意想不到的结果,但我不明白为什么.有谁可以用C++的方式启发我?我从学习C开始,因为我意识到我有多喜欢OOP.
我知道点到( - >)和点(.)运算符之间的区别,但我不明白为什么需要两个arrises?是不是总是那么容易不使用指针而只是使用点运算符?来自http://www.programcreek.com/2011/01/an-example-of-c-dot-and-arrow-usage/
#include <iostream>
using namespace std;
class Car
{
public:
int number;
void Create()
{
cout << "Car created, number is: " << number << "\n" ;
}
};
int main() {
Car x;
// declares x to be a Car object value,
// initialized using the default constructor
// this very different with Java syntax Car x = new Car();
x.number = 123;
x.Create();
Car *y; // declare y as a pointer which points to a …Run Code Online (Sandbox Code Playgroud) 我在学习C方面遇到了一些问题,而且我真的没有其他地方可以提出建议.我来自一系列OOP语言,例如JavaScript和主要是Python,因此C是一个重大变化,我在尝试学习基础知识方面遇到了一些障碍.我最初是从Zed Shaw的"艰难学习C"开始的,但他并没有在书中教授任何东西.是的,他让你写了很多代码并改变了一些东西,但是我不知道为什么代码会工作,而这只会导致更复杂的例子.
我遇到的主要问题是变量和指针之间的区别(我认为它是非常独特的,直到我看到一些我将在下面发布的例子,这完全模糊了两者之间的界限).
例如,我理解声明和初始化一个int被调用的a和一个指针,p看起来像这样:
int a;
int *p;
a = 12;
p = &a;
Run Code Online (Sandbox Code Playgroud)
令我困惑的是当你声明看起来像指针的变量,但根本不是指针(或者它们是什么?).例如:
char *string = "This is a string";
printf("%s\n", string);
Run Code Online (Sandbox Code Playgroud)
什么string时候定义和初始化?它是指针吗?如果是的话,为什么不在printf函数中打印它时取消引用它?有很多像这样的例子让我很困惑.
我遇到的另一个例子没有任何意义:
int i;
scanf("%d", &i);
Run Code Online (Sandbox Code Playgroud)
i当&符号应该引用变量的内存中的位置而不是值时,这个函数如何更新整数的值?阵列和结构变得更加复杂,这是我停下来的地方,我决定要找一些建议.
老实说,我觉得很尴尬发布这样一个菜鸟问题,但每个人都从某个地方开始.这些基础知识是我知道在继续之前需要能够理解的东西,但是当我看到与我刚刚学到的内容相矛盾的代码示例时,我很难理解它.我知道这是一个非常普遍的问题,但我希望你们中的一些人能够解释这些基础知识,或者指出我可以更好地学习/理解这一点的方向.我遇到的大多数视频教程都过于笼统,与在线文本教程相同,他们告诉你如何做某事,但不解释它,这会导致一些严重的问题.
在用普通的 C++ 编写了很多代码之后,我最近又回到了 Qt/C++ 编程。
在浏览 StackOverflow 时,我经常会看到诸如“为什么使用指针?”之类的帖子。在大多数情况下,答案的要点是“如果可以避免,请不要使用它们”。
在 C++ 中编码时,我现在主要尝试使用由 ( const) 引用传递的堆栈变量,或者,如有必要,std::shared_ptr分别使用。std::unique_ptr 需要的地方。
回到 Qt,我发现所有这些“原则”显然都被完全忽略了。
我知道 Qt 使用自己的内存管理来处理原始指针,但这是我的问题:
为什么他们至少不使用shared_ptror unique_ptr,特别是因为他们甚至有自己的实现QSharedPointer?
所以,假设我有一堂课MyClass.现在我想使用另一个叫做的类Animals,我可能会做以下事情.
class MyClass
{
public:
MyClass();
private:
Animals animals;
};
Run Code Online (Sandbox Code Playgroud)
不过我也可以这样做:
class MyClass
{
public:
MyClass();
private:
Animals* animals;
};
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令在构造函数中初始化类:
animals = new Animals();
Run Code Online (Sandbox Code Playgroud)
两种不同方法有什么区别,哪种更好,为什么?在我的使用中Animals应该只在里面使用MyClass.我的问题主要是关于性能和内存,我的意思是通过指针初始化需要更多资源吗?
我了解指针的前提,但是我觉得它很烦人,我不明白为什么它被认为有用:
#include <stdio.h>
int main () {
int *ptr, q;
q = 50;
ptr = &q;
printf("%d", *ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这是一个基本概念?
正如标题所示,我无法准确理解指针是什么以及为什么使用它们.我已经搜索了一下但仍然不太懂.我主要在Objective-C工作,但从我读过的内容来看,这更像是一个C主题(所以我添加了两个标签).
根据我的理解,前面带星号的变量指向内存中的地址?我不太明白为什么你使用指向值的指针而不是仅仅使用值本身.
例如:
NSString *stringVar = @"This is a test.";
Run Code Online (Sandbox Code Playgroud)
在这个字符串上调用方法时,为什么它是一个指针而不是直接使用字符串?为什么不使用指向整数和其他基本数据类型的指针?
有点偏离主题,但我是否正确标记了这个?在我编写它时,我认为它更像是一个编程概念,而不是特定于语言的东西,但它确实专注于Objective-C,所以我用objective-c和c标记它.
以此为例:
#include <memory>
#include <iostream>
int add(int a, int b) {
return a+b;
}
std::unique_ptr<int> addp(int a, int b) {
std::unique_ptr<int> ip(new int(a + b));
return ip;
}
int main(int argc, char const* argv[])
{
std::cout << add(3, 5) << std::endl;
std::cout << *(addp(3, 5)) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
功能addp是否会提高性能,或者换句话说,是否可以避免复制数据?我怀疑结果a+b是在堆栈中,然后以任何方式复制到堆中.
可能重复:
为什么要使用指针?
我刚刚掌握了指针,现在我的做法是积极地查看使用指针的场合,并在我可以设想的每种可能情况下使用它们.这是一个好主意吗?如果没有,为什么不呢?或者这仅仅是个人偏好?