在C语言中将字符串传递给函数 - 是否需要使用指针?

29

当我向函数传递字符串时,有时我使用

char *functionname(char *name[256])

有时我会不使用指针而直接使用它(例如:

char functionname(char name[256])

我的问题是,何时需要使用指针? 我经常编写没有指针的程序并且它可以正常工作,但有时会出现问题。


1
你说的“有时候它能工作,有时候它不能工作”是什么意思? - Anickyan
1
请不要让我们猜测。展示你的代码。足够让我们理解问题。 - David Heffernan
1
对于第一种选择,参数是一个包含256个字符串的数组。至少如果您修复标识符错误(名称中没有空格)。 - Some programmer dude
1
不,因为第一个例子存在语法错误:有一个额外的标识符。 - Nicola Musatti
这里有一个很好的例子,展示了如何在C语言中使用字符串和指针进行不同的操作。https://stackoverflow.com/a/46344713/5842403 - Joniale
3个回答

57

传递 C 字符串给函数的常规惯例是使用指针:

void function(char* name)

当函数修改字符串时,你也应该传入字符串的长度:

void function(char* name, size_t name_length)

你的第一个示例:

char *functionname(char *name[256])

传递一个指向字符串的指针数组,这不是你所需要的。

你的第二个示例:

char functionname(char name[256])

传递一个字符数组。这里数组的大小无关紧要,参数会自动退化为指针,所以这与以下代码等效:

char functionname(char *name)

请参考这个问题,了解C语言中有关数组参数的更多细节。


1
函数接收字符串的方式是 char functionname(char string[256]),这样会有什么危害吗? - Akay
void function(char* name)不修改C字符串时,它只适用于这种情况?将其声明为const是否有意义?对于大多数情况而言,您发送的指针也应该是const,因为您不会更改指针本身。 - Paul
char *functionname(char *string name[256]) 是语法错误,而不是“传递指针数组”。 - M.M
字符串实际存储在哪里? 如果我们只是执行 functionname("this is a string"),那么字符串将存储在哪里? 由于我们没有为要分配的空间指定长度,我们确定它不会覆盖任何内容吗? - user5730329

3
假设您的意思是写这个:
char *functionname(char *string[256])

这里你声明了一个函数,它以256个指向char的指针数组作为参数,并返回一个指向char的指针。然而在这里,

char functionname(char string[256])

您正在声明一个函数,该函数以256个char的数组作为参数并返回一个char

换句话说,第一个函数接受一个字符串数组并返回一个字符串,而第二个函数接受一个字符串并返回一个字符。


0

数组是一个指针。它指向一系列“对象”的起始位置。

如果我们这样做:int arr[10];,那么arr是一个指向内存位置的指针,从该位置开始有十个整数。它们未初始化,但内存已分配。这与执行int *arr = new int[10];完全相同。


#include <stdio.h> #include <string.h>void StringSort(char S[5][30]);void main() { char S[5][30]; int i;printf("请输入5个字符串:\n"); for(i = 0; i < 5; i++) gets(S[i]); printf("\n输入的字符串为:\n"); for(i = 0; i < 5; i++) puts(S[i]); StringSort(S); printf("\n按字符数排序后的字符串为:\n"); for(i = 0; i < 5; i++) puts(S[i]);}void StringSort(char S[5][30]) { char pS[30]; int i, j;for(i = 0; i < 4; i++) for(j = i + 1; j < 5; j++) if(strlen(S[i]) > strlen(S[j])) { strcpy(pS, S[i]); strcpy(S[i], S[j]); strcpy(S[j], pS); }} - Zen Cicevic
3
数组不是指针。例如,sizeof(arr) 对于数组和指针是不同的。而 new 是 C++ 中的语法,不是 C 语言中的。 - interjay
@interjay,抱歉,我没有考虑到这一点。你当然可以使用malloc()代替。 - Anickyan
#include <stdio.h> #include <stdlib.h> #include<string.h> char *fn(char *s1,char *s2);int main() { char a1[20],a2[20]; printf("输入字符串:"); gets(a1); printf("输入另一个字符串:"); gets(a2);printf("按字母顺序第一个是 %s",fn(a1,a2));}char *fn(char *s1,char *s2) { if(strcmp(s1,s2)<0) return s1; else return s2; } - Zen Cicevic
这两个程序都可以工作,但一个没有使用指针,另一个使用了。请查看以下链接:http://tny.cz/809ae075http://tny.cz/60dc68cf - Zen Cicevic
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接