C 在函数中传递指针的重要性是什么?

C 在函数中传递指针的重要性是什么?,c,pointers,longest-substring,C,Pointers,Longest Substring,为什么必须在lcs函数中传递指针X和Y?另外,当传递的不是指针而是数组时,会出现什么问题 #include<stdio.h> #include<string.h> int max(int a, int b); int lcs( char* X, char* Y, int m, int n ) { if (m == 0 || n == 0) return 0; if (X[m-1] == Y[n-1]) return 1 + lcs(X, Y, m-1

为什么必须在lcs函数中传递指针X和Y?另外,当传递的不是指针而是数组时,会出现什么问题

#include<stdio.h>
#include<string.h>

int max(int a, int b);

int lcs( char* X, char* Y, int m, int n )
 {
  if (m == 0 || n == 0)
  return 0;
  if (X[m-1] == Y[n-1])
  return 1 + lcs(X, Y, m-1, n-1);
else
  return max(lcs(X, Y, m, n-1), lcs(X, Y, m-1, n));
}

int max(int a, int b)
{
  return (a > b)? a : b;
}

int main()
 {
 char X[] = "AGGTAB";
 char Y[] = "GXTXAYB";

 int m = strlen(X);
 int n = strlen(Y);

 printf("Length of LCS is %d", lcs( X, Y, m, n ) );

 return 0;
#包括
#包括
int max(int a,int b);
整数lcs(字符*X,字符*Y,整数m,整数n)
{
如果(m==0 | | n==0)
返回0;
如果(X[m-1]==Y[n-1])
返回1+lcs(X,Y,m-1,n-1);
其他的
返回最大值(lcs(X,Y,m,n-1),lcs(X,Y,m-1,n));
}
最大整数(整数a,整数b)
{
返回(a>b)?a:b;
}
int main()
{
字符X[]=“AGGTAB”;
字符Y[]=“GXTXAYB”;
int m=strlen(X);
int n=strlen(Y);
printf(“LCS的长度为%d”,LCS(X,Y,m,n));
返回0;

}

每当您将数组传递给函数时,它都会转换为指向其第一个元素的指针。由于它包含使用它的第一个元素的地址,我们可以从另一个函数更改数组。这称为阵列衰减。即使您不想更改数组,它也会转换为指针

总而言之,如果不经过对指针的转换,就不可能传递数组。这就是你在这里看到的。根据C11标准(N1570),我们还可以引用:-

§

除非它是
sizeof
运算符的操作数、
\u Alignof
运算符或一元
&
运算符,或者是用于初始化数组的字符串文字,将类型为“类型的数组”的表达式转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是左值。如果数组对象具有寄存器存储类,则行为未定义