Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过带指针的数组进行迭代_C - Fatal编程技术网

C 通过带指针的数组进行迭代

C 通过带指针的数组进行迭代,c,C,所以我是一个C编程的初学者,了解指针,如何使用它们仍然给我带来一些麻烦。在这里,我只是尝试使用指针遍历数组。下面有一段代码,但它不是以55结尾,而是打印一个附加值(32765)。首先,有人能解释一下为什么我得到了额外的价值吗?第二,有人能告诉我如何将这个程序限制为数组中的值吗?我试着使用*pntr不再指向您的任何值,因为您调用未定义的行为。int数组不必以null结尾,因此不需要满足for循环终止条件。考虑一下*pntr一旦pntr不再指向任何值,因为调用了未定义的行为,它会做什么。int数组不

所以我是一个C编程的初学者,了解指针,如何使用它们仍然给我带来一些麻烦。在这里,我只是尝试使用指针遍历数组。下面有一段代码,但它不是以55结尾,而是打印一个附加值(32765)。首先,有人能解释一下为什么我得到了额外的价值吗?第二,有人能告诉我如何将这个程序限制为数组中的值吗?我试着使用*pntr<5作为条件,但没有打印任何内容

void iterate(int* li) {

    for (int *pntr = li; *pntr; pntr++) {
        printf("%d\n", *pntr);
    }
 }

int main(){

int values[] = {11, 22, 33, 44, 55};

iterate(values);
}
这是正确的代码

void walk(const int *arr, size_t n)
{
    int *p;

    for (p = arr; p < arr + n; ++p)
        printf("%d\n", *p);
}
void walk(const int*arr,size\n)
{
int*p;
对于(p=arr;p
这是因为
arr+n
arr
的基址获取
n
整数的地址

另外,
int
数组不是以null结尾的;只有
char
数组与引号一起使用时才可用。(
“abc”
而不是
{'a','b','c'}
)。

这是正确的代码

void walk(const int *arr, size_t n)
{
    int *p;

    for (p = arr; p < arr + n; ++p)
        printf("%d\n", *p);
}
void walk(const int*arr,size\n)
{
int*p;
对于(p=arr;p
这是因为
arr+n
arr
的基址获取
n
整数的地址


另外,
int
数组不是以null结尾的;只有
char
数组与引号一起使用时才可用。(
“abc”
而不是
{'a',b',c'}
)。

用于循环:

for (int *pntr = li; *pntr; pntr++) {
    printf("%d\n", *pntr);
}

…希望阵列以零结尾。通过使用
*pntr
作为测试,您正在测试
pntr
指向的值是否为零。因此,如果数组没有以零结束,则循环将偏离数组的末尾,直到它恰好碰到零或导致segfault。

for
循环:

for (int *pntr = li; *pntr; pntr++) {
    printf("%d\n", *pntr);
}

…希望阵列以零结尾。通过使用
*pntr
作为测试,您正在测试
pntr
指向的值是否为零。因此,如果数组没有以零结尾,那么循环将偏离数组的末尾,直到它恰好碰到零或导致segfault。

您的代码总体上还不错,但它缺少一个主要因素:工作结束条件

在for循环中,当您写入
*pntr
时,结束条件是当达到
0
的定点值时,循环将停止。但是,由于数组包含非零值,因此它将在为数组分配的内存之外获得一个值

幸运的是,您只看到一个额外的值,但您可能会看到更多的值

要修复缺少的结束条件,有两种解决方案:要么与
iterate
函数共享数组的长度,要么添加一个已知为数组最终值的值

因此,你要么:

void iterate(const int *arr, size_t n) {
    for (it = arr; it < arr+n ; +=it) printf("$d\n", *it);
}
(您可以使用
#定义最后一项0
,只要您使用的值在数组中不太可能出现)


这两个解决方案中,最好的一个是考虑数组的大小。

你的代码总体上不错,但缺少一个主要因素:工作结束条件。

在for循环中,当您写入
*pntr
时,结束条件是当达到
0
的定点值时,循环将停止。但是,由于数组包含非零值,因此它将在为数组分配的内存之外获得一个值

幸运的是,您只看到一个额外的值,但您可能会看到更多的值

要修复缺少的结束条件,有两种解决方案:要么与
iterate
函数共享数组的长度,要么添加一个已知为数组最终值的值

因此,你要么:

void iterate(const int *arr, size_t n) {
    for (it = arr; it < arr+n ; +=it) printf("$d\n", *it);
}
(您可以使用
#定义最后一项0
,只要您使用的值在数组中不太可能出现)


这两个解决方案中,最好的一个是考虑数组的大小。

考虑“<代码> *pNTR >一旦代码“> PNTR < /代码>不再指向您的任何值,因为您调用未定义的行为。
int
数组不必以null结尾,因此不需要满足
for
循环终止条件。考虑一下
*pntr
一旦
pntr
不再指向任何值,因为调用了未定义的行为,它会做什么。
int
数组不必以null结尾,因此您的
for
循环终止条件不需要满足。感谢您的回复,这无疑为我澄清了问题。通过谷歌搜索,我能找到的大部分内容都是关于字符数组的,所以我可以看到我是如何在这里感到困惑的。谢谢你的回复,这无疑为我澄清了问题。通过谷歌搜索我能找到的大部分内容都是关于字符数组的,所以我可以看出我是如何在这里感到困惑的。