Tag: 数组

在C中删除数组中的元素

我只是对C中的数组有一个简单的问题 从数组中删除元素的最佳方法是什么,并且在此过程中使数组变小。 即数组是n大小,然后我从数组中取出元素,然后数组变小,我删除它的数量。 基本上我把arrays视为一副牌,一旦我从牌组的顶部拿出一张牌就不应该了。 编辑:我会在一天结束前让自己疯狂,感谢所有帮助我正在尝试价值交换的事情,但它不能正常工作。 #include #include #include enum faces{Ace = 0, Jack = 10, Queen, King}; char * facecheck(int d); int draw(int deck, int i); int main() { int deck[52], i, n; char suits[4][9] = { “Hearts”, “Diamonds”, “Clubs”, “Spades”}; n = 0; for(i = 0; i<52; i++) { deck[i] = n; n++; }; […]

数组和数组有什么区别?

假使,假设 int array[16]; 有一种称为数组到指针转换的标准转换,因此array将被隐式转换为int*类型,但为什么&array等于array ? 例如, int array[16]; void *p = array; void *q = &array; printf(“%p\n”, p); printf(“%p\n”, q); 这将给出相同的地址和没有编译错误。 为什么?

可靠地确定数组中的元素数量

每个C程序员都可以使用这个众所周知的宏来确定数组中元素的数量: #define NUM_ELEMS(a) (sizeof(a)/sizeof 0[a]) 这是一个典型的用例: int numbers[] = {2, 3, 5, 7, 11, 13, 17, 19}; printf(“%lu\n”, NUM_ELEMS(numbers)); // 8, as expected 但是,没有什么能阻止程序员意外地传递指针而不是数组: int * pointer = numbers; printf(“%lu\n”, NUM_ELEMS(pointer)); 在我的系统上,这打印2,因为显然,指针是整数的两倍。 我想过如何防止程序员错误地传递指针,我找到了一个解决方案: #define NUM_ELEMS(a) (assert((void*)&(a) == (void*)(a)), (sizeof(a)/sizeof 0[a])) 这是有效的,因为指向数组的指针与指向其第一个元素的指针具有相同的值。 如果改为传递指针,指针将与指向自身的指针进行比较,这几乎总是假的。 (唯一的例外是递归的void指针,也就是指向自身的void指针。我可以忍受它。) 意外地传递指针而不是数组现在在运行时触发错误: Assertion `(void*)&(pointer) == (void*)(pointer)’ failed. 太好了! 现在我有几个问题: 我使用assert作为逗号表达式有效标准C的左操作数吗? 也就是说,标准是否允许我使用assert作为表达式? 对不起,如果这是一个愚蠢的问题:) 可以在编译时以某种方式完成检查吗? […]

C – SizeOf指针

char c[] = {‘a’,’b’,’c’}; int* p = &c[0]; printf(“%i\n”, sizeof(*p)); //Prints out 4 printf(“%i\n”, sizeof(*c)); //Prints out 1 我对这部分代码非常困惑。 p和c都表示第0个索引处的数组c的地址。 但是为什么sizeof(* p)打印4? 不应该是1吗?

如何使用动态分配的任意维数组?

典型的1-D数组可以在声明中静态或自动分配。 enum { n=100 }; int arr1[n]; 或者通过指针动态分配和访问。 int *arr1m=malloc(n*sizeof*arr1m); int *arr1c=calloc(n, sizeof*arr1c); 这两种样式都使用相同的语法访问元素。 int i = n/2; arr1[i] = arr1c[i] = arr1m[i] = 42; 但是当你添加第二个维度时,需要花费一些力气来实现相同的语法。 int arr2[n][n]; int *arr2c=calloc(n*n,sizeof*arr2c); arr2[5][5] = arr2c[5*n+5] = 23; 如果您将其构造为Iliffe向量,则只能获得双重括号。 int **arr2l=calloc(n,sizeof*arr2l); for (int j=0; j<n; j++) arr2l[j]=calloc(n,sizeof**arr2l); arr2[6][6] = arr2l[6][6] = 72; 但随着尺寸的增加,这变得越来越麻烦。 另一个困难是在访问元素之前检查动态数组的边界(这样您就不会触及未正确分配的内存)。 真实数组可以使用sizeof运算符来确定边界,但这些动态数组中没有一个带有它们的大小。 如何定义具有快速,连续布局的结构,如数组,但具有一致的语法,用于访问具有索引列表的元素,这些索引对于2Darrays和3Darrays的工作方式相同; 并动态地,动态地提供大小,以便它们可以传递给函数并从函数返回?

仅使用返回的指针获取malloc的大小

我希望能够改变我的数组的大小,所以我这样创建一个: int* array; array = malloc(sizeof(int)*10);//10 integer elements 我可以像往常一样使用它像数组一样,但是当我试图找到它的大小时: size = sizeof(array)/sizeof(int); 我得到了答案1,因为它没有将其识别为指向数组 如何获得arrays的大小? (我知道它在技术上不是一个数组,但有没有办法计算出分配的内存块的整个大小?) 我也正确地假设我在描述中说明了什么? 如果我在技术上对某事有误,请纠正我。

C,Malloc()和数组长度

可能重复: 如何找到sizeof(指向数组的指针) 我正在学习如何在C中创建动态数组,但遇到了一个我无法弄清楚的问题。 如果我使用代码: int num[10]; for (int i = 0; i < 10; i++) { num[i] = i; } printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 我得到输出: sizeof num = 40 sizeof num[0] = 4 这就是我期望发生的事情。 但是,如果我malloc数组的大小如下: int *num; num = malloc(10 * sizeof(int)); for (int i = 0; i < […]

GCC:数组类型具有不完整的元素类型

我已经声明了一个结构,我尝试将这些结构的数组(以及双数组和一个整数)传递给一个函数。 当我编译它时,我从gcc得到一个“数组类型具有不完整的元素类型”消息。 我如何将结构传递给函数我有什么问题? typedef struct graph_node { int X; int Y; int active; } g_node; void print_graph(g_node graph_node[], double weight[][], int nodes); 我也试过了struct g_node graph_node[] ,但我得到了同样的东西。

在C中,为什么我不能在声明后将字符串赋值给char数组?

这一直困扰着我。 struct person { char name[15]; int age; }; struct person me; me.name = “nikol”; 当我编译时,我收到此错误: 错误:从类型’char *’分配类型’char [15]’时出现不兼容的类型 我错过了一些明显的东西吗?

可以在c的运行时确定数组的大小吗?

据我所知,在编译c的时间之前,数组需要具有特定的大小。 我想知道为什么这段代码仍然有用? int s; printf(“enter the array size: “); scanf(“%d”,&s); int a[s]; // Isn’t s value determined at run time?