C函数实现 - 使用Pointer vs without Pointer

Dav*_*vid 3 c pointers

我刚刚开始使用C,并且从来没有处理过我以前用过的语言中的指针,所以我想知道如果只是修改一个字符串,哪种方法更好.

指针串与正常.

此外,如果您想提供有关何时使用指针的更多信息,那将是很棒的.当我发现函数"normal"甚至会修改传递的字符串,并在main函数中更新而没有返回值时,我感到很震惊.

#include <stdio.h>

void pointerstring(char *s);
void normal(char s[]);

int main() {
    char string[20];
    pointerstring(string);
    printf("\nPointer: %s\n",string);
    normal(string);
    printf("Normal: %s\n",string);
}

void pointerstring(char *s) {
    sprintf(s,"Hello");
}
void normal(char s[]) {
    sprintf(s,"World");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Pointer: Hello
Normal: World
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 7

在函数声明中,char []并且char *是等效的.具有外层数组类型的函数参数被转换为等效的指针类型; 这会影响调用代码和函数体本身.

因此,最好使用char *语法,否则您可能会感到困惑,并尝试例如采用sizeof外层固定长度数组类型参数:

void foo(char s[10]) {
    printf("%z\n", sizeof(s));  // prints 4 (or 8), not 10
}
Run Code Online (Sandbox Code Playgroud)

当您传递一个声明为函数指针的参数(并且未声明指针参数const)时,您将明确赋予该函数权限以修改指针指向的对象或数组.


sbi*_*sbi 5

C中的一个问题是阵列是二等公民.在几乎所有有用的情况下,它们传递给函数时,数组会衰减到指针(从而丢失它们的大小信息).

因此,无论是采用数组T* arg还是后者都没有区别T arg[]- 后者仅仅是前者的同义词.两者都是指向string定义的变量的第一个字符的指针main(),因此它们都可以访问原始数据并可以修改它.


注意:C始终为每个副本传递参数.在这种情况下也是如此.但是,当您传递一个指针(或一个衰减到指针的数组)时,复制的是地址,因此所引用的对象可以通过其地址的两个不同副本访问.