我想在匹配对象的Object指针向量中找到它.这是一个示例代码来说明我的问题:
class A {
public:
A(string a):_a(a) {}
bool operator==(const A& p) {
return p._a == _a;
}
private:
string _a;
};
vector<A*> va;
va.push_back(new A("one"));
va.push_back(new A("two"));
va.push_back(new A("three"));
find(va.begin(), va.end(), new A("two"));
Run Code Online (Sandbox Code Playgroud)
我想找到推入向量的第二个项目.但由于vector被定义为指针集合,C++不使用我的重载运算符,而是使用隐式指针比较.什么是首选的C++ - 在这种情况下解决方案的方式?
我模糊地回忆起在回答另一个问题之前看到这个,但是搜索未能得出答案.
我不记得声明作为指针的变量的正确方法是什么.是吗:
Type* instance;
Run Code Online (Sandbox Code Playgroud)
要么:
Type *instance;
Run Code Online (Sandbox Code Playgroud)
虽然我知道两者都会在大多数情况下编译,但我相信有一些例子很重要,可能与在同一行上声明同一类型的多个变量有关,因此一个比另一个更有意义.
我在初始化结构数组时遇到问题.我不确定我是否做得对,因为我得到"从不兼容的指针类型初始化"和"从不兼容的指针类型分配".我在代码中添加了这些警告,当我尝试从结构中打印数据时,我只是得到垃圾,例如@@ ###
typedef struct
{
char* firstName;
char* lastName;
int day;
int month;
int year;
}student;
Run Code Online (Sandbox Code Playgroud)
//初始化数组
student** students = malloc(sizeof(student));
int x;
for(x = 0; x < numStudents; x++)
{
//here I get: "assignment from incompatible pointer type"
students[x] = (struct student*)malloc(sizeof(student));
}
int arrayIndex = 0;
Run Code Online (Sandbox Code Playgroud)
//添加struct
//create student struct
//here I get: "initialization from incompatible pointer type"
student* newStudent = {"john", "smith", 1, 12, 1983};
//add it to the array
students[arrayIndex] = newStudent;
arrayIndex++;
Run Code Online (Sandbox Code Playgroud) 我是一名试图学习C++的C#/ Java开发人员.当我尝试学习指针的概念时,我很惊讶以前我必须处理这个概念.如何仅使用.NET或Java开发人员熟悉的概念来解释指针?我是否真的从来没有处理过这个问题,它只是隐藏在我身上,还是我一直都在使用它而不称之为?
template <typename T>
class Node
{...};
int main
{
Node* ptr;
ptr = new Node<int>;
}
Run Code Online (Sandbox Code Playgroud)
将无法编译我必须将指针声明为
Node<int>* ptr;
Run Code Online (Sandbox Code Playgroud)
为什么在声明指针时我必须指定类型我还没有创建类,为什么编译器必须知道它将指向哪种类型.并且不可能创建一个通用指针,然后决定我想要分配它的类型.
我试图找到a的最大像素值cv::Mat.
问题:*maxValue总是回归0.
从这个SO线程,我理解' max_element返回迭代器,而不是值.这就是我使用*maxValue'的原因
cv::Mat imageMatrix;
double sigmaX = 0.0;
int ddepth = CV_16S; // ddepth – The desired depth of the destination image
cv::GaussianBlur( [self cvMatFromUIImage:imageToProcess], imageMatrix, cv::Size(3,3), sigmaX);
cv::Laplacian(imageMatrix, imageMatrix, ddepth, 1);
std::max_element(imageMatrix.begin(),imageMatrix.end());
std::cout << "The maximum value is : " << *maxValue << std::endl;
Run Code Online (Sandbox Code Playgroud)
注意:如果min_element替换代替max_element,则minValue代替maxValue,*minValue将始终返回0.
我有以下几行代码:
#define PORT 9987
Run Code Online (Sandbox Code Playgroud)
和
char *ptr = (char *)&PORT;
Run Code Online (Sandbox Code Playgroud)
这似乎适用于我的服务器代码.但是当我在我的客户端代码中编写它时,它会给出以下错误消息:
lvalue required as unary ‘&’ operand
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
代码1
#include<stdio.h>
int main(int argc, char *argv[])
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码2
#include<stdio.h>
int main(int argc, char **argv)
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CODE 1和CODE 2都提供相同的输出.但是CODE 1和CODE 2中主要功能的参数2是不同的.在编译时在数据部分上创建指针数组.argv是指针数组.然后我们应该在main函数中声明参数作为指向字符的指针,即**argv.在CODE 1中声明如何正确?
假设我有一些结构定义如下:
struct foo { int a; };
struct bar { struct foo r; int b; };
struct baz { struct bar z; int c; };
Run Code Online (Sandbox Code Playgroud)
C标准是否保证以下代码严格符合要求?
struct baz x;
struct foo *p = (void *)&x;
assert(p == &x.z.r);
Run Code Online (Sandbox Code Playgroud)
这种结构的动机是提供一致的编程习惯用于转换为已知兼容的指针类型.
现在,这就是C所说的结构及其初始成员如何可转换:
在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.结构对象中可能存在未命名的填充,但不是在其开头.
C.11§6.7.2.115
这就是void指针转换的内容:
指针
void可以转换为指向任何对象类型的指针.指向任何对象类型的指针可以转换为指向void和返回的指针; 结果应该等于原始指针.
C.11§6.3.2.31
这就是关于在对象指针类型之间进行转换的说法:
指向对象类型的指针可以转换为指向不同对象类型的指针.如果对于引用的类型,结果指针未正确对齐(68),则行为未定义.否则,当再次转换回来时,结果将等于原始指针.
68)一般来说,''正确对齐''这个概念是传递性的:如果一个指向类型A的指针正确地对齐指向类型B的指针,而指针又指向一个指向类型C的指针,那么指向类型的指针对于指向类型C的指针,A正确对齐
.C.11§6.3.2.37
我从上面的理解是,通过转换将对象指针void *转换为不同类型的对象指针是完全正确的.但是,我得到的评论表明不然.
这是一个简短的C程序,它提示用户输入一个数字,创建一个具有该大小的可变长度的int数组,然后使用指针算法来跳过已分配的元素:
#include <stdio.h>
int main() {
/* Read a size from the user; inhibits compiler optimizations. */
int n;
scanf("%d", &n); // Yes, I should error-check. :-)
/* We now have a VLA. */
int arr[n];
/* What is the type of &arr? */
void* ptr = (&arr) + 1;
/* Seems like this skipped over things properly... */
printf("%p\n", arr);
printf("%p\n", ptr);
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以在ideone上试试这个.输出表明该行
void* ptr = (&arr) + 1;
Run Code Online (Sandbox Code Playgroud)
获取可变长度数组中arr所有n元素的步骤,并以大小识别的方式执行.
如果这不是一个可变长度数组,我会完全放心它是如何工作的.编译器会知道它的类型arr …