왜 작동합니까?고정 크기 배열 동작에 대한 포인터
uint8_t array[4] = {1,2,3,4};
uint8_t* parray = array;
uint8_t (*p1)[4] = (uint8_t (*)[4])&array;
uint8_t (*p2)[4] = (uint8_t (*)[4])&parray;
uint8_t (*p3)[4] = (uint8_t (*)[4])parray;
uint8_t test1 = **p1; // test1 = 1
uint8_t test2 = **p2; // test2 = something random
uint8_t test3 = **p3; // test3 = 1
parray 분명 거의 배열과 동일하다. 예를 들어, array [0] == parray [0]. 그러나 배열 포인터를 고정 크기 배열에 대한 포인터로 가져 오려면 & 기호를 사용해야합니다. 포인터에 대한 포인터를 얻으려고하면 안됩니다.
실용 예제.
내가 포인터로 다른 함수에서 PARAM을 얻을 때 고정 크기 배열
void foo(uint8_t (*param)[4])
{
...
}
에 대한 포인터를 받아들이는 기능은 내가 foo는이 방법으로 전달할 수있다?
void bar(uint8_t param*)
{
uint8_t (*p)[4] = (uint8_t (*)[4])param;
foo(p);
}
더 좋은 방법이 있습니까?
을 사용할 수 있습니다. 아마도 당신이 마음에서 지울 필요가있는 첫 번째 것은 너무 많은 입문 텍스트에서 영속되는 거짓말 일 것입니다. 포인터와 배열은 "거의 동일"합니다. 그들은 그렇지 않습니다. 어떤 상황에서는 그것들을 사용하는 표현이 같은 결과를 낳습니다. 그래서 때때로 거짓말이 사실로 보입니다. 그러나, 당신은 거짓말이 진정 거짓말 인 방식으로 그들을 사용하고 있습니다. – Peter
'foo'가'uint8_t (*) [4]'형식의 인수를 사용하는 이유는 무엇입니까? –
@DavidBowling 필자는'bar'가'foo'를 호출 할 때'uint_8 * '을 취하는 이유에 더 흥미를 느낍니다. – user2079303