2017-06-14 65 views
1

使用指针例如,如果我有一个数组,我想提取该阵列的元件与指定的值作为新的数组提取阵列的一部分。我做如下所示:通过用C

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; 
    } 
} 

所以,对于阵列“一”我提取价值1中的所有元素,并让他们成为新阵列“B”。我怎样才能通过使用指针来实现同样的事情?它会比这种方式简洁吗?如果有可能,还有其他优势吗?

+2

没有必要把解压出来的具体指标,一旦你知道计数。应该只是能够做'for(i = 0; i

+0

@EastonBornemeier哦,是的,你是对的。谢谢你的评论。 – Syoung

+0

你的问题是什么?我不明白。 – Stargateur

回答

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]; 
    } 
} 

希望它可以帮助一点。

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

在这种情况下,没有,没有任何好处。 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; 
}