C指针再次访问

C指针再次访问,第1张

概述我学习使用指针. 关于我写的练习代码,我有几个问题. 首先,如果我有以下功能代码: //function prototypevoid processCars(char *, char []);int main(){...//actual callto the functionprocessCars(strModel[x], answer);...}void processCar 我学习使用指针.
关于我写的练习代码,我有几个问题.

首先,如果我有以下功能代码:

//function prototypevoID processCars(char *,char []);int main(){...//actual callto the functionprocessCars(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 prototypevoID processCars( aCar *,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 *,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字符串的许多问题.感谢您的回答.

解决方法 在函数本身内,两个参数都是指针.参数列表中的[]绝对没有区别,它只是语法糖.

虽然数组和指针之间存在明显差异,但传递给函数的数组总是衰减到相应类型的指针.例如,char [3]类型的数组将衰减为char *,char * [3]将衰减为char **.

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

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

char strMakes[3][20] = {"VW","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指针再次访问全部内容,希望文章能够帮你解决C指针再次访问所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241288.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存