重新访问C指针

重新访问C指针,c,pointers,C,Pointers,我正在学习使用指针。 关于我写的练习代码,我有几个问题 首先,如果我有以下功能代码: //function prototype void processCars(char *, char []); int main(){ ... //actual callto the function processCars(strModel[x], answer); ... } void processCars(char * string1, char string2[]) { ... } 定义此pro

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

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

//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是字符串的起始位置(最好是一个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公民。在大多数情况下,它们会退化为指向第一个元素的指针。这发生在函数调用(和原型)中。在您的示例(
void processCars(char*string1,char string2[])
)中,
string2
参数实际上是一个指针,就像
string1
一样。请阅读。@pmg:术语问题:如果数组是二级公民,指针是一级公民,那么一个数组不应该被“提升”吗从前者到后者是什么时候?我的意思是,数组是“提升为指针”而不是“衰减为指针”?或者指针不是一级元素?LOL@sidyll:an
int
int
int
指针
指针
指针
。。。对。。。
char
char
int
float
double
double
数组
是一个
数组
是一个
指针
lol在这里发布此内容,因为它是一个很好的教程:谢谢您的回答。还有更正确的方法吗?当我做char-strMakes[3][20]={“大众”、“保时捷”、“奥迪”};我被限制为一个最多20个字符的模型名,而当我使用我的方式时,我甚至没有指定字符串的大小。那么,什么更好呢?顺便说一句,我们这些用C语言编程或想用C语言编程的人,是不是属于一个已经灭绝的邪教?因此,对于一个非常重要的问题,有很多答案…@Oz123:您必须指定内部数组的长度,因为外部数组需要所有元素的大小相同。就内存使用而言,这可能是一种浪费,但将它们在某个边界上对齐可以在O(1)中实现索引。另一种方法是仍然有一个指针数组,但是指针应该指向可变内存。关于第二个问题,是的,我确实认为C程序员现在是濒危物种。那么我应该费心学习C吗?面临危险,可能意味着没有工作,或者意味着更高的工资?
/* 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};