这个问题听起来可能有点奇怪,但我从来没有完全理解为什么我们需要有两种不同的语法来删除C++中的动态分配内存?
例如,
int *p = new int[10];
delete[] p; // why not just delete p;?
在普通的老C中,您只需使用free函数来释放分配给指针的内存,而不管分配的元素数量如何。当然,C++要复杂一些,因为它允许类类型调用它们的析构函数等等。但是,我认为使用单一语法删除C++中动态分配的内存没有任何障碍。
有什么根本原因决定使用两个版本,delete和delete[]?
更重要的是,如果您使用delete而不是delete[],大多数编译器甚至都
上下文:
在发现a[i]只是*(a + i)的语法糖,因此相当于*(i + a)和i[a]之前,我用for和off编程了大约2年。我的现实被颠倒了很多“啊哈!”在接下来的几天学习和阅读中,狂欢时刻接踵而至(“这就是为什么数组总是通过引用传递的原因!”)等)。从那时起,我就把指针/数组的等价性内化了,并把它紧紧地放在我的心脏上,所以想象一下,当我偶然发现一种叫做“阵列衰减”的东西时,是多么的震惊啊。以下是典型的例子:
代码:
#include <stdio.h>
int Length(int*);
int main () {
int arr[100];
printf(
在c++中,数组标识符是指针,而在java中,数组的标识符是引用变量(实际上是指针)。
假设有一个数组a和b。在java中怎么会允许这个操作:
a = b; //the reference that 'b' holds will be copied to 'a' so both a and b point to the same array
但在C++中,相同的操作将被视为无效的赋值。
如果a和b都是c++中的指针,为什么b保存的地址不会被复制到a
第1行导致error: conversion from ‘C<void()>’ to non-scalar type ‘C<void (*)()>’ requested。我知道我可以将它写成第2行,但是如何使用make_class()并将它赋值给一个变量呢?
#include <iostream>
using namespace std;
template<class T> class C {
T f;
public:
C(T ff) : f(ff) {}
};
template<class Ft> C<
在许多编程语言(包括、和)中,可以在内部放置一个数组。在这里,我试图把一个C整数数组放在它的第三个索引处,但是我不确定在C编程语言中是否支持这个:
#include <stdio.h>
int main(void) {
int arr[] = {1, 1, 2};
arr[2] = arr; //now I'm trying to put arr into itself.
printf("%i", arr[2]); //this prints a negative number each time I run the program
C++标准要求所有类型的大小至少为1字节,即使结构没有成员。即
struct x { };
但
sizeof(x) == 1
数组也是如此。声明零长度数组(在C、C++和C99中)是不符合标准的。
int x[0]; // not allowed in C, C++ and C99 standards
那这是为什么?在我看来,这似乎是一个不可缺少的要求,它实际上带来了不一致。
我知道有些编译器允许零长度数组作为扩展,而且C99允许在结构的末尾使用“零”长度数组,但是这更多的是可变长度数组,只有在结构结束时才有可能。
因此,我的问题是:在语言标准中填充零长度数组或要求大小大于0的理由是什么?
我只是在学习神经网络,我想让神经元的构造器接收一个指针,指向一个数组中的一个部分,该部分将是染色体。如下所示:
public int* ChromosomeSection;
public Neuron(int* chromosomeSection)
{
ChromosomeSection = chromosomeSection;
}
然后我会用这样的东西来创建我的神经元:
int[] Chromosome = new int[neuronsCount * neuronDataSize];
for (int n = 0; n < Chromosome.Length; n +=
我们掌握的信息包括:
1)定义数组a[1000],a为指针地址。
2)
void swap(int &c, int &b)
{
c=c+b;
b=c-b;
c=c-b;
}
// this is a method of swapping two variables without using temp variable.
// We use call by reference for the swap to actually take place in memory.
现在,当我为a的两个条目调用这个函数时,说a[i],a[j] ...what发生了?
该函数需要一个指向二维数组[4][5]的指针.实际上,我们可以提交一个指向一维数组[20]的指针.Ie源代码如下所示:
extern f (int a[4][5]);
int b[20];
void func (void)
{
f (b);
}
这是完美的工作代码(如果内部的数组b,我们将像他们在一个二维数组的布局)。不过,汇编将发出警告(由于类型不足):
$ gcc t.c -c
t.c: In function 'func':
t.c:7: warning: passing argument 1 of 'f' from incompatible poin
我目前正在为一个名为“王权”的游戏开发一个服务器系统。我使用钩子和氧化物开发人员给出的命令来制作我的服务器系统。回到典当语言中,我们可以对数组中的播放器数据进行枚举,将其转换为2d数组--这很酷。和PlayerDataplayerid一样,数据可以是任何东西,从一个名为pAdminLevel的接口到一个名为pPassword的字符串。
我明白,在C#,事情是不同的。所以我试着复制这样的方法:
pData[] PlayerData = new pData[MAX_PLAYERS];
public class pData
{
private int _admin;
public i
目前,我正在阅读比亚恩·斯特鲁普的“C++之旅”。重要的是:在“指针、数组和引用”上,他给出了一个使用nullptr的示例,如下所示:
int count_x(char* p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{
if (p == nullptr) return 0;
int count = 0;
for (; p != nullp
我正在尝试使用指针更改字符数组组件的值。但我不能这样做。使用两种不同的方法(即char A[]和char *A )声明数组是否有根本区别
我试着用A[0]访问数组,它起作用了。但我不能更改数组组件的值。
{
char *A = "ab";
printf("%c\n", A[0]); //Works. I am able to access A[0]
A[0] = 'c'; //Segmentation fault. I am not able to edit A[0]
printf("%c\n",