퀴즈를 풀기 전 제가 c를 공부한 내용은 해당 깃에 올라가 있습니다.
https://github.com/h-b-cho/CBasic.git
값 바꾸기의 공식과도 같은 대표적인 예제이다.
C에서 배열 매개 변수는 항상 포인터로 처리됩니다. 따라서 다음 두 문장은 같은 의미를 갖습니다.
void fun(int arr[])
void fun(int *arr)
위에서 []는 함수가 배열을 받고자 하고 있음을 분명히 하기 위해 사용됐지만, 아무 것도 변경하지는 않습니다. 사람들은 []을 판독기가 의도된 매개변수 유형을 명확하게 알 수 있도록 가독성을 위해서만 사용합니다.
결론은 배열 매개 변수에 size of를 사용해서는 안 되며 배열 크기(또는 길이)에 대한 별도의 매개 변수를 fun()으로 전달해야 한다는 것입니다.
즉 위에서 arr_size는 포인터 크기와 정수 크기의 비율을 포함하며, 이 비율은 컴파일러에 따라 달라집니다.
void fun(int arr[], size_t arr_size)
{
int i;
for (i = 0; i < arr_size; i++) {
printf("%d ", arr[i]);
}
}
int main()
{
int i;
int arr[] = {10, 20 ,30, 40};
size_t n = sizeof(arr)/sizeof(arr[0]); // Use of sizeof is fine here
fun(arr, n);
return 0;
}
///Output: 10 20 30 40
/* p points to i and q points to j */
void f(int *p, int *q)
{
p = q; /* p also points to j now */
*p = 2; /* Value of j is changed to 2 now */
}
두 포인터가 같은 값을 가리킬 수 있다.
S1: 컴파일 오류를 생성합니다.
S2: 전달된 인수에 따라 런타임에 분할 오류를 생성할 수 있습니다.
S3: 프로세스에 액세스할 수 있는 메모리 위치에 저장된 정수를 참조하는 모든 입력 포인터에 대해 스왑 절차를 올바르게 구현합니다.
S4: 일부 유효한 입력 포인터에 대해 스왑 절차를 올바르게 구현합니다.
S5: 정수와 포인터를 추가하거나 뺄 수 있습니다.
**ppz += 1
/* z is changed to 5*/
z = **ppz;
/* changes c to 7, x is not changed */
*py += 2;
/* y is changed to 7*/
y = *py;
/* x is incremented by 3 */
x += 3;
/* return 7 + 7 + 5*/
return x + y + z;
우선, 참고로 c는 결과적으로 5가 된다.
x는 c의 변화 과정에서부터 영향받지 않는다. x는 c와 별개이기 때문이다. x는 c의 복사본이고 x의 주소는 c와 별개이다.
.
.
.
.
.
.