저는 C로 배열 된 프로그래밍 및 학습 포인터를 처음 사용합니다. 아래 프로그램을 살펴보십시오.* p와 (* p) [3]의 차이점은 무엇입니까?
1 프로그램
#include<stdio.h>
int fun();
int main()
{
int num[3][3]={21,325,524,52,0,6514,61,33,85};
fun(num);
printf("%d",*(*(num+1)+1));
*(*(num+1)+1)=0;
printf("%d",*(*(num+1)+1));
return 0;
}
int fun(int **p)
{
*(*(p+1)+1)=2135;
return 0;
}
2 프로그램
#include<stdio.h>
int fun();
int main()
{
int num[3][3]={21,325,524,52,0,6514,61,33,85};
fun(num);
printf("%d",*(*(num+1)+1));
*(*(num+1)+1)=0;
printf("%d",*(*(num+1)+1));
return 0;
}
int fun(int *p)
{
*((p+1)+1)=2135;
return 0;
}
3 프로그램
#include<stdio.h>
int fun();
int main()
{
int num[3][3]={21,325,524,52,0,6514,61,33,85};
fun(num);
printf("%d",*(*(num+1)+1));
*(*(num+1)+1)=0;
printf("%d",*(*(num+1)+1));
return 0;
}
int fun(int (*p)[3])
{
*(*(p+1)+1)=2135;
return 0;
}
- 첫 번째 프로그램에서
**p
은fun()
함수에서 사용되었습니다.이 함수는 올바른 것으로 생각하고 함수의 첫 번째 배열의 첫 번째 요소를 변경하려면*(*(p+1)+1)
을 작성했습니다. 그러나이 프로그램을 컴파일하면error: invalid type argument of unary '*' (have 'int')
이 표시됩니다. 내가 아는 한 num은 배열을 가리키는 포인터이고, 다시num[1][0]
의 주소를 가지고있는num[1]
의 주소를 보유하고있다. - 두 번째 프로그램 컴파일러를 컴파일하는 중에 오류가 표시되지 않습니다.
*((p+1)+1)=0
은 첫 번째 배열의 두 번째 요소 값을 변경합니다. 왜 첫 번째 배열의 첫 번째 요소의 값이 아닌 0 번째 배열의 두 번째 요소의 값을 변경하고 있습니까? 그리고 어떻게?*(*(p+1)+1)=0
이어야합니다. - 세 번째 프로그램에서 컴파일러에 오류가 표시되지 않고 올바른 결과가 표시됩니다. 방법?.
*(p)[3]
의 의미는 무엇입니까?
나는 이것에 대해서 조사했지만 만족스러운 결과를 찾을 수 없었다.
"+0"의 모든 항목을 제거한 다음 불필요한 중괄호를 모두 제거하십시오. 그들은 아무 쓸모가없고 심한 두통을 일으킨다. – fjf2002
배열의 이름은 배열의 첫 번째 요소에 대한 포인터입니다. 내부적으로는 실제로는 같지 않지만 포인터로 사용할 수 있습니다. – Joachim
나는 질문을 편집했다. :) –