我熟悉 Java,并尝试教自己C/C++.我正在从一个正在托管材料 here的课程中窃取一些课程.我不幸的是不能问老师,因为我不在课堂上.我关心的是“动态声明数组”下的部分:

If you
want to be able to alter the size of
your array at run time,then declare
dynamic arrays. These are done with
pointers and the new operator. For the
basics on pointers,read the pointers
section.

Allocate memory using new,and then
you access the array in the same way
you would a static array. For example,

int* arrayPtr = new int[10]; for
(int i = 0; i < 10; i++) {
arrayPtr[i] = i; }

The memory picture is identical to the
static array,but you can change the
size if you need to. Don’t forget you
must deallocate the memory before
allocating new memory (or you will
have a memory leak).

delete [] arrayPtr; // the []
is needed when deleting array pointers
arrayPtr = new int[50]; . . .

When you’re completely done with the
array,you must delete its memory:

delete [] arrayPtr;

Dynamic multi-dimensional arrays are
done in a similar manner to Java. You
will have pointers to pointers. For an
example,see a

我的理解是,C中的数组只是引用数组中第一个元素的内存地址.

那么int * pointerarray = new int [10]有什么区别?和int数组[10];如果有的话

我做了一些测试,似乎表明他们做同样的事情.网站错了还是我读错了?

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc,char** argv) {

    // Initialize the pointer array
    int *pointerarray = new int[10];
    for (int i = 0; i < 10; i++){

        pointerarray[i] = i;
    }

    // Initialize the regular array
    int array[10];
    for (int i = 0; i < 10; i++){

        array[i]= i;
    }

    cout << *(pointerarray + 5) << endl;
    cout << *(array + 5) << endl;

    cout << pointerarray[5] << endl;
    cout << array[5] << endl;

    cout << pointerarray << endl;
    cout << array << endl;

    return 0;
}

输出:

5
5
5
5
0x8f94030
0xbfa6a37c

我试图按照网站上的描述“动态地重新调整”我的指针数组,但是我的新(较大)指针数组最后填满了0,这不是很有用.

解决方法

int array [10];静态地声明数组大小,这意味着它是固定的 – 这是唯一的主要区别.它也可能被分配到功能的堆栈帧内,即在程序的堆栈上.你不需要担心在这种数组上使用delete [],实际上如果你删除它,你可能会崩溃程序.

当您使用operator new时,您可以动态分配内存,这可能较慢,内存通常来自堆,而不是程序的堆栈(尽管并非总是).这在大多数情况下更好,因为堆栈空间比堆空间更受限制.但是,当您不再需要它时,您必须注意内存泄漏并删除[]您的东西.

至于你的数组充满了零,你的课堂材料没有说,你必须这样做:

int *arr = new int[20]; // old array
//do magic here and decide that we need a bigger array
int *bigger = new int[50]; // allocate a bigger array
for (int i = 0; i < 20; i++) bigger[i] = arr[i]; // copy the elements from the old array into the new array
delete[] arr;
arr = bigger;

该代码将阵列arr再增加30个元素.请注意,您必须将旧数据复制到新数组中,否则它将不会存在(在您的情况下,所有内容都将变为0).

c – 有什么区别?指向数组与正常数组的指针的更多相关文章

  1. Swift 对象内存模型探究一

    由于Swift是一种静态语言,没有OC那种灵活的Runtime机制,为了达到类似JSONModel的效果,HandyJSON另辟蹊径,绕过对Runtime的依赖,直接操作实例的内存对实例属性进行赋值,从而得到一个完全初始化完成的实例。本文将通过探究Swift对象内存模型机制,简单介绍HandyJSON实现原理.内存分配Stack(栈),存储值类型的临时变量,函数调用栈,引用类型的临时变量指针Heap(堆),存储引用类型的实例MemoryLayout基本使用方法MemoryLayout是Swift3.0推出

  2. PHP中的数组内部指针是什么?

    我使用end()将数组的内部指针设置为它的最后一个元素.然后我使用key()来获取最后一个元素的键.例如:我唯一不理解的是数组的内部指针是什么.有人可以向我解释一下吗?我一直在努力,但无法找到解释.另外,如何设置数组的内部指针会影响该数组?

  3. php – 如何测试数组指针是否在foreach循环中的第一个元素

    在一个for循环它是简单的这是如何在foreach循环中完成的?有没有像is_first()或某事的功能?整个布尔方式似乎几乎像…

  4. 设置内部数组指针,不用PHP迭代

    无需首先遍历数组就可以设置PHP的内部数组指针.以下面的虚拟代码为例:使用ArrayIterator::seek提供的LibertyPaul解决方案似乎是使PHP设置指针到数组中的位置的唯一方法,而不会初始化用户界面中的循环.尽管如此,您可以从ArrayIterator::seek()的PHPsource中读取,PHP将内部循环通过数组来设置指针:所以看起来没有办法将数组指针设置到某个位置,而不会

  5. Delphi – 从无类型指针填充的动态数组中访问数据

    我正在使用Delphi2009而不是它对我正在做的事情有很大的影响.如果我还在2007年,我想我会遇到同样的情况.我有一个scsi调用,它将数据输出到一个指针(错误的方式查看它,但我很难解释).最初我使用Move来填充返回的数据的Byte静态数组,但是我想切换到一个动态数组,在调用时已经知道了它的长度.我尝试了几个不同结果的东西,有些得到了数据,但有疯狂的访问权限,其他人没有错误但得到无效的数据.

  6. delphi – 如何使用ScanLine属性的24位位图?

    如何使用ScanLine属性的24位位图像素操纵?你可以问自己为什么使用这样棘手的技术,如使用ScanLine属性貌似是当你可以简单地使用Pixels访问你的位图的像素。ScanLine属性赢得了这场比赛,因为提供了对存储位图像素数据的内存的直接访问。ScanLine用途这个帖子的主菜单,ScanLine属性,是一个只读的索引属性,它返回指向属于位图中指定行的原始数据字节数组的第一个字节的指针。

  7. c# – 将指针数组转换为IntPtr数组

    我被困在一个看似简单的工作上,需要你的帮助.我需要编写一个具有以下签名的方法:其中实际的参数可以是任何pointertype的数组(例如int*[],long**[],void*[,]),并返回与类型为System.IntPtr的元素具有相同数值的元素相同形状的数组的输入数组.问题是如果我不知道他们的类型,我不明白如何提取指针的数值.例如,如果我事先知道我的参数总是类型为void*[],我可以写如

  8. 在C中使用多个间接?

    在什么情况下可能需要使用多个间接在C?解决方法@aku指出的最常见的用法是允许在函数返回后更改指针参数.这将打印但是,还有其他一些有用的用法,如下面的示例,迭代字符串数组并将其打印到标准输出.

  9. c中的“新”运算符,指针问题

    愚蠢的问题,但每当你打电话,你总是有一个指针?那是因为你需要一个指针指向为SomeClass变量人员分配的内存的新空间?解决方法如果新的成功完成,它总是返回一个指针.指针是指创建的对象,或者在数组的情况下,指向数组的第一个元素的指针.

  10. 在char指针上使用strcpy时程序会中止? (在char数组上工作正常)

    我很困惑,为什么以下不起作用:在两个例子中,strcpy都收到一个char*,但在第一个例子中,它死了一个可怕的死亡.解决方法“abcdef”和“ddd”是可能驻留在地址空间的只读部分的字符串文字.chars[]=“ddd”确保这个文字被复制到堆栈–所以它是可修改的.

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部