我学习使用指针 关于我写的练习代码,我有几个问题。
首先,如果我有以下功能代码:
//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的指针,它是字符串的起始位置(或更好的字符数组)? 第二个实际上是一组字符直接。
现在,假设我想通过引用传递几个字符串数组甚至结构数组。我设法创建了以下代码,但我仍然没有完全了解我正在做的事情。
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 ){
}
所以,我的qeustion是如何定义这个“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字符串的许多问题。感谢您的回答。
答案 0 :(得分:6)
在函数本身中,两个参数都是指针。参数列表中的[]
完全没有区别,它只是语法糖。
虽然数组和指针之间存在明显差异,但传递给函数的数组总是衰减到相应类型的指针。例如,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};