我知道数组名称可以用作指针(尽管它是转换后的形式),但我的问题是,是否有一些其他实例,其中数组充当指针.
我想实现一个可以在添加新值时增加的数组.就像在Java中一样.我不知道该怎么做.任何人都可以给我一个方法吗?
这是为了学习目的,因此我无法使用std::vector.
可能重复:
C中的char s []和char*s有什么区别?
char a [] ="string"之间的区别; char*p ="string";
首先,我想问一下我在哪里可以学习char*和char []的所有基础知识.
大多数时候,我发现自己在如何比较和如何申报方面苦苦挣扎.
例1:
char *test = "hello world";
Run Code Online (Sandbox Code Playgroud)
这将在编译时产生以下警告:
warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)
例2:
vector<char*> test2;
test2.push_back("hello world");
Run Code Online (Sandbox Code Playgroud)
这将产生复制字符串的错误.
所以我想出的解决方案是:
(它是否正确?)
vector<char*> test3;
char *str1 = "hello world"
test3.push_back(str1);
Run Code Online (Sandbox Code Playgroud)
提前致谢!:)
============================================
这里的人提供了两个好的读物:
可能重复:
数组名是C中的指针吗?
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char *b=(char*)malloc(sizeof(char)*50);
b=(char*)"hello world";
// works
char a[50];
a=(char*)"hello world";
//doesn't work. why? I thought array names are just pointers that point
//to the first element of the array (which is char). so isn't a char*?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为它不起作用的原因是因为没有名为"a"的变量实际上存储了char*值.那么'a'应该被视为右值吗?我不确定我是否正确理解了这个概念
关于数组和指向数组的指针,我有一个相当简单的问题.考虑这段代码片段..
int (*ptr)[3]; //A pointer to an array of 3 ints
int arr1[3] = {2,4,6,};
ptr = &arr1; //ptr now points to arr1
//3 different ways to express the same address
cout << &arr1 << "\t" << arr1 << "\t" << &arr1[0] << endl;
Run Code Online (Sandbox Code Playgroud)
现在如果:
&arr1 == arr1 == &arr1[0]..
Run Code Online (Sandbox Code Playgroud)
为什么这段代码不正确:
ptr = arr1;
Run Code Online (Sandbox Code Playgroud)
要么
ptr = &arr1[0];
Run Code Online (Sandbox Code Playgroud)
这一直让我发疯...所以请任何解释将不胜感激.另外请不要这不是一个家庭作业问题,只是我想要抓住的东西.
当我尝试用g ++编译以下代码时:
int main()
{
int a[3] = {0, 1, 2};
int (* p)[] = &a;
}
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误:"无法在初始化中将'int()[3]'转换为'int()[]'.为什么不能将int()[3]转换为int()[]?如果不可能,那么应该如何初始化'int(*)[]'类型的变量?
我试图理解指针,我不能得到一件事.例如,
//part of code
int *p;
int tab[3];
Run Code Online (Sandbox Code Playgroud)
所以现在我们有变量tab包含数组的第一个元素的地址.我想创建一个指向该指针的指针.所以,我会这样做:
p=&tab;
Run Code Online (Sandbox Code Playgroud)
如果它可以工作,p将是tab(这意味着它会指向tab)的地址不幸的是它不起作用.那么如何获得指针本身的地址呢?地址的正确类型是什么?(addresstype *p)我想指向内存块,它包含第一个元素的地址tab,而不是它tab自身.
我正在编写自己的2d矩阵类.我想设计这个类的使用非常接近真正的数学符号.例如,我想访问元素作为矩阵[3,6].但是c ++并没有提供这种能力,但我可以通过下一种方式访问基本的多维数组:
int matrix[2][2] = {};
int val = matrix[1][0];
Run Code Online (Sandbox Code Playgroud)
所以我决定创建返回基数组的函数.对于这个角色,最好的函数是operator().所以我可以通过下一个方式访问:matrix()[1] [0].好的,我开始实施它并坚持:(.看看我有什么:
template <typename ValType>
class Matrix2D
{
protected:
ValType m_data[2][2] = {};
public:
ValType** operator()() // <--- what type?
{
return m_data;
}
}
Run Code Online (Sandbox Code Playgroud)
但我在上面的函数中收到了编译器错误
错误C2440:'return':无法从'double [2] [2]'转换为'double**'
我理解错误,但不知道我必须改变什么来避免这个错误?该函数必须返回什么类型?
我有一个看起来像这样的结构.
struct puzzle {
int d[16];
};
Run Code Online (Sandbox Code Playgroud)
我听说C/C++中的数组和指针是相同的,所以我认为struct会存储一个指针,而指针指向一个int数组.但是,我使用调试器进行了简单的实验,看看它是如何存储的,我发现数组直接存储在结构中.
如果我声明两个数组,一个在堆栈上,一个在堆上,我在打印变量名时会得到不同的行为(如果重要的话,在gdb中).
int array_on_stack[5];
int * array_on_heap = new int[5];
Run Code Online (Sandbox Code Playgroud)
现在在gdb中,我逐步执行每行代码,然后打印变量名,期望获取每个代码的内存地址.
print array_on_stack
print array_on_heap
Run Code Online (Sandbox Code Playgroud)
但是array_on_stack它打印数组的内容而不是内存地址.为了获取内存地址,我需要命令print &array_on_stack.这表明这array_on_stack不是一个指针.有人可以解释这两个声明在如何访问其内存地址方面的区别以及为什么会出现这种情况?