例如,如果我有一个数组,并且我想要将具有指定值的此数组的元素作为新数组提取。我做了如下:
int a[10] = { 1, 2, 1, 3, 2, 3, 4, 1, 2, 6 };
int i, k;
int count = 0;
for (i = 0; i < 10; i++) {
if (a[i] == 1) {
count = count + 1;
}
}
int b[count];
k = 0;
for (i = 0; i < 10; i++) {
if (a[i] == 1) {
b[k] = a[i];
k = k + 1;
}
}
因此,对于数组“a”,我提取了值1的所有元素,并将它们作为新数组“b”。如何通过使用指针实现相同的功能?它会比这更简洁吗?如果有可能,还有其他优势吗?
答案 0 :(得分:3)
我想你已经注意到你只需要多次写1
;但我想你想要它适用于任意条件。
“使用指针”可以表示动态内存分配而不是可变长度数组。只是为了使用指针,你可以写:
int *b = malloc(count * sizeof(int));
k = 0;
for (i = 0; i < 10; i++) {
if (a[i] == 1) {
b[k] = a[i];
k = k + 1;
}
}
如果,为了使用指针进行编写过程,您可以按如下方式调整程序:
int *b = malloc(count * sizeof(int));
int *bPtr = b;
for (i = 0; i < 10; i++) {
if (a[i] == 1) {
*bPtr++ = a[i];
}
}
希望它有所帮助。
答案 1 :(得分:3)
如果你不知道你的目标值将在数组的哪个部分,就像在你的情况下,你在整个未排序的数组中搜索特定值,那么使用指针而不是线性搜索,找到你所追求的数组中的元素。
但是,如果,您试图从数组中的已知索引开始访问或复制一组连续的元素,那么您可以使用指针来简化操作。例如,如果我在char
数组中的最后几个元素之后,这可以工作:
#include <stdio.h>
int main()
{
char str[100] = "I don\'t want anyone to think I hate the Calgary Flames";
char *c = (str + 29);
printf("%s\n", c);
return 0;
}
输出:
I hate the Calgary Flames
答案 2 :(得分:2)
在这种情况下,不,没有任何好处。 a[i]
已基本为a + (sizeof(int) * i)
。即使你使用了指针,你仍然必须做所有的计数,以确保你不会走出数组的末尾。
它常用的方法是使用一个空终止的指针数组,例如一个字符串,你不知道它的长度。但这并不是关于性能的。如下所示,他们必须做大致相同的事情。
char string[] = "foo bar";
// Allocate and initialize i.
// `string + i` twice, compare, increment.
for( int i = 0; string[i] != '\0'; i++ ) {
printf("%c", string[i]);
}
puts("");
// Allocate and initialize s.
// Dereference s twice, compare, increment.
for( char *s = string; *s != '\0'; s++ ) {
printf("%c", *s);
}
puts("");
当你需要通过几个步骤迭代数组时,通过指针迭代是很方便的。而不是传递原始数组指针加上最后一个索引,并更改所有函数签名以适应,只需传递递增的指针并返回递增的指针。这允许您在字符串的中间使用标准字符串函数。
#include <stdio.h>
char *findVal( char *string, char delim ) {
char *val = string;
for( ; *val != '\0' && *val != delim; val++ ) {
}
if( val == '\0' ) {
return NULL;
}
else {
// val is sitting on the ':'
return val+1;
}
}
int main() {
char string[] = "this:that";
char *val = findVal(string, ':');
if( val != NULL ) {
// Just use val, not string[valIdx].
printf("%s\n", val);
}
}
这也更安全。对于偏移,有两件事必须保持同步,指针和偏移;这可能会导致错误的偏移量与错误的指针一起使用。递增的指针带有它的偏移量。
正如评论中指出的那样,你可以像这样收紧第二个循环:
int b[count];
for (i = 0; i < count; i++) {
b[i] = 1;
}