带数组指针的 C 函数
C function with array pointer
我正在尝试编写一个函数,当给定一个数组和一个值时,它会检查该值是否在该数组中。如果存在,则在将其添加到数组之前继续寻找新的唯一随机值。这是我到目前为止所做的,但我认为问题是我对指针缺乏理解。这是我目前所拥有的:
#include <stdio.h>
#include <stdlib.h>
int getNewIndex(int index, int *visitedPixels, int *visitedPixelsIndex);
int main() {
int *visitedPixels = malloc(2 * sizeof(int));
int *visitedPixelsIndex = 0;
srand(1);
int randIndex = rand() % 16, i;
printf("Initial randIndex = %d\n", randIndex);
for(i = 0; i < 16; i++) {
randIndex = getNewIndex(randIndex, visitedPixels, visitedPixelsIndex);
printf("randIndex[%d] = %d\n", i, visitedPixels[i]);
}
return 0;
}
int getNewIndex(int index, int *visitedPixels, int *visitedPixelsIndex) {
int i = 0;
while (i < *visitedPixelsIndex) {
(index == visitedPixels[i]) ? index = rand() % 16, i = 0 : i++;
}
visitedPixels[*visitedPixelsIndex] = index;
(*visitedPixelsIndex)++;
//(*visitedPixels) = realloc(visitedPixels, (*visitedPixelsIndex+1) * sizeof(int));
return index;
}
如有任何帮助,我们将不胜感激。
好的,就这样。我将尝试用一个比喻来解释。希望它能有所帮助而不是造成更多混乱。
想象内存是一块可以写数字的长板。写小数需要一寸板。更大的数字可以通过在更多的插槽中书写来表示。
在我们的比喻中,数组只是一块连续的板,您可以在其中写入内容。如果您想要一个包含 5 个整数的数组,并且每个整数占 4 英寸,则需要 20 英寸的木板。如果你想将所有这些整数传递给一个函数,而不是将它们全部复制过来,你应该写下你的数组距离板的末端有多少英寸。这就是指针。这是一个数字,告诉某物在哪里。
当您调用 malloc( 2 * sizeof( int ) )
时,您请求了一块足够大的电路板以容纳两个整数,并且您收到了该新电路板距离电路板末端的英寸数。所以我们从末端得到 8 英寸的板 X 英寸,X 是我们的指针。
递增指针表示 "increase this value to point at the next element of the underlying array"。 int*
将增加 4,一个指向结构的指针增加了结构的大小加上编译器为其决定的任何对齐偏移量。
不会增加存储量。
如果我有一个指向两个 8 英寸板的指针,写一个 4 英寸数字,将指针递增指向 4 英寸,写另一个 4 英寸数字并再次递增,我的指针现在就在最后一个之后数组的元素。如果我写在这里,所有的赌注都没有了。阵列后的板上是什么?谁知道。它可以是任何东西。也许这是一个不同的阵列。也许这是用于跟踪董事会的哪些部分已交给程序的信息。也许这是我的董事会的结尾,我会注销结尾。写入未从操作系统获得许可的内存是 "segment violations"、SIGSEGV、程序失败的信号来源。
您需要预先请求更多 space,或者根据需要请求更大的数组。还有一个 realloc 也可以做到这一点。对于所有这些,您必须检查调用是否失败并终止或以其他方式适当地恢复。
希望这比混淆更有帮助。祝你好运:)
我正在尝试编写一个函数,当给定一个数组和一个值时,它会检查该值是否在该数组中。如果存在,则在将其添加到数组之前继续寻找新的唯一随机值。这是我到目前为止所做的,但我认为问题是我对指针缺乏理解。这是我目前所拥有的:
#include <stdio.h>
#include <stdlib.h>
int getNewIndex(int index, int *visitedPixels, int *visitedPixelsIndex);
int main() {
int *visitedPixels = malloc(2 * sizeof(int));
int *visitedPixelsIndex = 0;
srand(1);
int randIndex = rand() % 16, i;
printf("Initial randIndex = %d\n", randIndex);
for(i = 0; i < 16; i++) {
randIndex = getNewIndex(randIndex, visitedPixels, visitedPixelsIndex);
printf("randIndex[%d] = %d\n", i, visitedPixels[i]);
}
return 0;
}
int getNewIndex(int index, int *visitedPixels, int *visitedPixelsIndex) {
int i = 0;
while (i < *visitedPixelsIndex) {
(index == visitedPixels[i]) ? index = rand() % 16, i = 0 : i++;
}
visitedPixels[*visitedPixelsIndex] = index;
(*visitedPixelsIndex)++;
//(*visitedPixels) = realloc(visitedPixels, (*visitedPixelsIndex+1) * sizeof(int));
return index;
}
如有任何帮助,我们将不胜感激。
好的,就这样。我将尝试用一个比喻来解释。希望它能有所帮助而不是造成更多混乱。
想象内存是一块可以写数字的长板。写小数需要一寸板。更大的数字可以通过在更多的插槽中书写来表示。
在我们的比喻中,数组只是一块连续的板,您可以在其中写入内容。如果您想要一个包含 5 个整数的数组,并且每个整数占 4 英寸,则需要 20 英寸的木板。如果你想将所有这些整数传递给一个函数,而不是将它们全部复制过来,你应该写下你的数组距离板的末端有多少英寸。这就是指针。这是一个数字,告诉某物在哪里。
当您调用 malloc( 2 * sizeof( int ) )
时,您请求了一块足够大的电路板以容纳两个整数,并且您收到了该新电路板距离电路板末端的英寸数。所以我们从末端得到 8 英寸的板 X 英寸,X 是我们的指针。
递增指针表示 "increase this value to point at the next element of the underlying array"。 int*
将增加 4,一个指向结构的指针增加了结构的大小加上编译器为其决定的任何对齐偏移量。
不会增加存储量。
如果我有一个指向两个 8 英寸板的指针,写一个 4 英寸数字,将指针递增指向 4 英寸,写另一个 4 英寸数字并再次递增,我的指针现在就在最后一个之后数组的元素。如果我写在这里,所有的赌注都没有了。阵列后的板上是什么?谁知道。它可以是任何东西。也许这是一个不同的阵列。也许这是用于跟踪董事会的哪些部分已交给程序的信息。也许这是我的董事会的结尾,我会注销结尾。写入未从操作系统获得许可的内存是 "segment violations"、SIGSEGV、程序失败的信号来源。
您需要预先请求更多 space,或者根据需要请求更大的数组。还有一个 realloc 也可以做到这一点。对于所有这些,您必须检查调用是否失败并终止或以其他方式适当地恢复。
希望这比混淆更有帮助。祝你好运:)