在 C 中通过引用传递的指针和参数的工作

Working of pointers and parameters passing by reference in C

提问人:Alessandro Argentini 提问时间:11/12/2023 更新时间:11/12/2023 访问量:46

问:

我的 C 编程背景非常薄弱,在学校学习了非常基础的 C 语言后,我刚刚重新开始用 C 编程。

我正在用指针做练习,以了解我对它们的掌握程度,我想写一个非常简单的 C 函数,它接受 3 个参数,一个字符串,它的 dim 和另一个字符串,然后反转它们。

我的代码如下:

void inverter (char* cstringa, int dim, char* inversion) {
    printf("%d\n", dim);
    for (int i = 0; i < dim; i++) {
        cstringa++;
    }
    for (int i = 0; i < dim; i++) {
        *inversion = *cstringa;
        printf("%c", *inversion);
        inversion++;
        cstringa--;
    }
}

主要:

char stringa1[11] = {'A', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', '\0'};
    char* pstringa1 = stringa1;

    char inversione[strlen(stringa1)];
    inversione[0] = '\0';
    char* pinversione = inversione;

    inverter(stringa1, strlen(stringa1), inversione);
    for(int i = 0; i < strlen(inversione); i++) {
        printf("%c", *pinversione);
        pinversione++;
    }

我希望这段代码能反转我的字符串(string1=cstringa,它的dim=dim,string2=inversion),但它没有这样做,因为值没有像我给他时所期望的那样存储在inversione中inversione的第一个单元格的内存地址。为什么会这样?

我还注意到,当我在逆变器功能中逐个字符打印倒置的字符串时,它不会打印最后一个字母“A”,尽管尺寸和循环设置都是正确的。为什么?

感谢您的耐心等待。

我希望在输出中得到第一个字符串的反转,并且通过引用传递的参数运行正常。

数组 C 指针参数

评论

0赞 Some programmer dude 11/12/2023
我建议你使用调试器逐行执行代码,同时监视变量及其值,看看到底发生了什么。
0赞 Tom Karzes 11/12/2023
这段代码有很多问题。首先,您是否了解不计算终止 null 字符?所以你的数组太小了,而且你要写到它的末尾。此外,在循环测试中调用几乎总是错误的(除非字符串长度实际上可能在循环中发生变化)。如果你是手动完成的,你不会每次都通过循环重新计算字符串的长度,对吧?那么,为什么你的代码会这样做呢?不要指望编译器会为你移动它。在许多情况下,它不能。strlenstrlen
0赞 Alessandro Argentini 11/12/2023
@TomKarzes 嗨。好吧,事实上,我不想计算终止 null 字符。我想忽略他,否则它会在反转时将其插入字符串的开头。
0赞 Tom Karzes 11/12/2023
@AlessandroArgentini 当然,但是您打算如何使结果无效终止?你仍然需要空间,对吧?除非结果短于原始字符串。如果它不是以 null 结尾的,则它不是普通的 C 字符串,并且不能使用 格式说明符 in (除非你绑定了长度) 。%sprintf
0赞 Alessandro Argentini 11/12/2023
@TomKarzes是的,你是对的。我完全忘记了终止字符串。

答:

0赞 Weather Vane 11/12/2023 #1

原因是因为你前进指向终结者,所以你需要移动到第二个循环的开头cstringa++;cstringa--;

另一个问题是在你没有设置最终终止符的地方使用,所以也需要将其添加到函数中。strlen(inversione)

#include <stdio.h>

void inverter (char* cstringa, int dim, char* inversion) {
    printf("%d\n", dim);
    for (int i = 0; i < dim; i++) {
        cstringa++;
    }
    for (int i = 0; i < dim; i++) {
        cstringa--;        // reposition
        *inversion = *cstringa;
        printf("%c", *inversion);
        inversion++;
    }
    *inversion = 0;       // terminate
    printf("\n");
}

int main(void)
{
    char stringa1[11] = {'A', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', '\0'};
    char* pstringa1 = stringa1;

    char inversione[strlen(stringa1) + 1];   // allow for terminator
    inversione[0] = '\0';
    char* pinversione = inversione;

    inverter(stringa1, strlen(stringa1), inversione);
    for(int i = 0; i < strlen(inversione); i++) {
        printf("%c", *pinversione);
        pinversione++;
    }
    return 0;
}

输出:

10
ordnasselA
ordnasselA

评论

0赞 Weather Vane 11/12/2023
请注意,代码将更容易键入(和阅读)char stringa1[] = "Alessandro";