gpt4 book ai didi

重访 C 指针

转载 作者:太空狗 更新时间:2023-10-29 17:11:24 26 4
gpt4 key购买 nike

我正在学习使用指针。
关于我写的一个练习代码,我有几个问题。

首先,如果我有如下函数代码:

//function prototype
void processCars(char *, char []);

int main(){
...
//actual callto the function
processCars(strModel[x], answer);
...
}

void processCars(char * string1, char string2[])
{
...
}

如何正确定义此 processCars 函数的参数?第一个 - char * - 是一个指向 char 的指针,它是字符串的起始位置(或者更好的字符数组)?第二种其实直接就是一个char数组。

现在,假设我想通过引用传递一些字符串数组甚至结构数组。我设法创建了以下有效的代码,但我仍然没有完全理解我在做什么。

typedef struct car {

char make[10];
char model[10];
int year;
int miles;

} aCar; // end type

// function prototype
void processCars( aCar * , char **, char **, int *, int *);

//aCar * - a pointer to struct of type car
//char **, char **
// int * - a pointer to integer
// Arrays passed as arguments are passed by reference.
// so this prototype works to
//void processCars( aCar * , char **, char **, int [], int []);


int main(){

aCar myCars[3]; // an array of 3 cars

char *strMakes[3]={"VW","Porsche","Audi"}; // array of 3 pointers?
char *strModel[3]={"Golf GTI","Carrera","TT"};
int intYears[3]={2009,2008,2010};
int intMilage[3]={8889,24367,5982};

// processCars(myCars, strMakes);
processCars(myCars, strMakes, strModel, intYears, intMilage);

return 0;
} // end main

// char ** strMakes is a pointer to array of pointers ?
void processCars( aCar * myCars, char ** strMakes, \
char ** strModel, int * intYears, \
int * intMilage ){
}

所以,我的问题是如何定义这个“char ** strMakes”。它是什么,为什么对我有用?

我也注意到,我无法更改字符串的一部分,因为如果我更正(或我阅读的引用资料)字符串是只读的。所以,就像在 python 中一样,我可以使用数组索引来访问字母 V:

printf("\n%c",strMakes[0][0]); 

但是,与 python 不同,我无法更改它:

strMakes[0][0]="G" // will not work? or is there a way I could not think of?

因此,感谢您阅读我的长篇博文以及许多关于指针和 C 字符串的问题。感谢您的回答。

最佳答案

在函数本身中,两个参数都是指针。参数列表中的 [] 完全没有区别,它只是语法糖。

尽管数组和指针之间存在明显区别,但传递给函数的数组 始终会衰减为相应类型的指针。例如,char[3] 类型的数组将衰减为 char *char *[3] 将衰减为 char **

char *strMakes[3] 是一个长度为 3 的数组,它包含指向存储在其他地方的字符串的指针,可能在进程的只读区域中。尝试修改字符串本身将导致未定义的行为,很可能是保护错误。

如果您希望能够修改字符串,您可以将其声明为包含数组 的数组,而不是指针:

char strMakes[3][20] = {"VW", "Porsche", "Audi"};

这样,字符串将连续存储在外部数组的边界内。

另一种方法是仍然有一个指针数组,但指针应该指向可变内存:

/* these strings are mutable as long as you don't write past their end */
char str1[] = "VW";
char str2[] = "Porsche";
char str3[] = "Audi";
char *strMakes[3] = {str1, str2, str3};

关于重访 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8269015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com