C에서 *와 &의 차이점은 무엇입니까?
저는 C를 배우고 있는데 아직도 제가 C 사이의 차이점을 이해했는지 잘 모르겠습니다.&
그리고.*
아직은.
설명해 보겠습니다.
int a; // Declares a variable
int *b; // Declares a pointer
int &c; // Not possible
a = 10;
b = &a; // b gets the address of a
*b = 20; // a now has the value 20
저는 이것들을 얻었지만, 그러면 혼란스러워집니다.
void funct(int a) // A declaration of a function, a is declared
void funct(int *a) // a is declared as a pointer
void funct(int &a) // a now receives only pointers (address)
funct(a) // Creates a copy of a
funct(*a) // Uses a pointer, can create a pointer of a pointer in some cases
funct(&a) // Sends an address of a pointer
그래서 둘 다funct(*a)
그리고.funct(&a)
그렇죠 네?뭐가 달라요?
*
그리고.&
형식 수정자로
int i
int. 을 합니다.int* p
int에 대한 포인터를 선언합니다.int& r = i
int에 대한 참조를 선언하고 참조하도록 초기화합니다.i
.
C++만 해당. 시 되어야 하므로 "" " " " " " 입니다.int& r;
불가능합니다.
마찬가지로:
void foo(int i)
int(값으로, 즉 복사본으로)를 취하는 함수를 선언합니다.void foo(int* p)
.int 에 합니다.void foo(int& r)
참조로 int를 취하는 함수를 선언합니다. (C++만 해당)
*
그리고.&
조작자로서
foo(i)
출들foo(int)
매개 변수는 복사본으로 전달됩니다.foo(*p)
int에서 포인터를 하지 않습니다.p
및호라고 부릅니다.foo(int)
로의 로.p
.foo(&i)
의 주소사용다니합를▁▁of▁▁address의 주소를 사용합니다.i
및호라고 부릅니다.foo(int*)
(tl;dr) 그래서 결론적으로, 문맥에 따라,
*
참조 해제 연산자이거나 포인터 선언 구문의 일부일 수 있습니다.&
연산자의 주소이거나 참조 선언 구문의 (C++) 부분일 수 있습니다.:
*
곱셈 연산자일 수도 있습니다.&
비트 AND 연산자일 수도 있습니다.
funct(int a)
의 복사본을 만듭니다.
funct(int* a)
int에 대한 포인터를 입력으로 사용합니다.포인터의 복사본을 만듭니다.
funct(int& a)
int를 사용하지만 참조를 통해 a는 이제 주어진 int와 정확히 같습니다.사본이 아닙니다.포인터가 아닙니다.
void funct(int &a)
참조를 사용하는 함수를 선언합니다.참조는 개념적으로 함수가 전달된 변수를 수정할 수 있는 포인터이지만 구문적으로 값처럼 사용됩니다(따라서 참조를 항상 취소할 필요는 없습니다).
원래 C에는 포인터가 있었고 참조는 없었습니다.종종 우리는 값을 복사하지 않고 값에 액세스하고 실제 값이 아닌 주소를 전달한다는 사실은 중요하지 않은 세부 사항입니다.
C++는 포인터의 배관을 추상화하기 위한 참조를 도입했습니다.C++의 함수에 값을 "표시"하려면 참조가 좋습니다.함수는 참조가 null이 아니며 값 자체인 것처럼 액세스할 수 있음을 보장합니다.목적을 위해 를 들어 나 " 조준수 있습니다. 예를 들어 포인터를 "다시 조준"할 수 있습니다.delete
포인터를 사용하지만 참조를 사용할 수는 없습니다.
그들의 기능은 실제로 겹치고 약간의 역사가 없다면 우리가 둘 다 가지고 있다는 것을 혼란스럽게 할 것입니다.
그래서 당신의 직접적인 질문에 대한 대답은 종종 차이가 없다는 것입니다.그렇긴 하지만,f(int*)
함수가 포인터가 null인지 확인할 수 있도록 하려면 유용합니다.C를 사용하는 경우 포인터가 유일한 옵션입니다.
의 *
컨텍스트에 따라 다릅니다.데이터 또는 함수 인수 선언에서 연산자가 아닌 데이터 형식 한정자입니다. int*
자체가 데이터 유형입니다.이러한 이유로 다음과 같이 쓰는 것이 유용합니다.
int* x ;
다음보다:
int *x ;
그들은 동일하지만, 첫 번째 형태는 그것이 강조합니다.*
는 형식 이름의 일부이며, 참조 해제 연산자로 사용되는 것과 시각적으로 구분됩니다.
인스턴스화된 포인터 변수에 적용하면 참조 해제 연산자가 되고 지정된 값이 생성됩니다.
&
C는 연산자일 뿐이며 객체의 주소(또는 포인터)를 산출합니다.선언에 사용할 수 없습니다.C++에서 이것은 포인터와 비슷하지만 더 제한적인 동작을 가지고 있기 때문에 종종 더 안전한 참조에 대한 유형 한정자입니다.
여기 의견에 대한 귀하의 제안은 다음과 같습니다.
funct(&a) // Sends an address of a pointer
정확하지 않습니다.:a
전달됩니다. 이는 "포인터의 주소"만 됩니다.a
그 자체가 포인터입니다.포인터는 주소입니다.대상 포인터의 주소 유형int
되요지일 입니다.int**
(포인터에 대한 포인터).
포인터와 값 변수의 기본 원리를 설명할 필요가 있습니까?포인터는 변수의 메모리 위치를 설명하고 값은 메모리 위치의 내용을 설명합니다.
<typename>
*
에 대한 포인터입니다.<typename>
데이터 형식&
*<value-variable>
의 주소 또는 위치(즉, 에 대한 포인터)를 산출합니다.*
*<pointer-variable>
포인터가 나타내는 주소의 값을 산출하기 위해 포인터를 참조하지 않습니다.
예를 들어 다음과 같습니다.
int a = 10 ;
int* pa = &a ;
그리고나서
*pa == 10
당신이 "참조에 의한 호출"이라고 불리는 func(&a)를 할 때, 이것은 당신의 매개 변수 "a"가 실제로 함수 내에서 수정될 수 있고, 변경된 내용이 호출 프로그램에 보일 것이라는 것을 의미합니다.이 방법은 함수에서 다음과 같은 여러 값을 반환하려는 경우에 유용합니다.
int twoValues(int &x)
{
int y = x * 2;
x = x + 10;
return y;
}
만약 당신이 당신의 메인 프로그램에서 이 함수를 다음과 같이 부른다면:
int A, B;
B = 5;
A = twoValues(B);
이로 인해 다음과 같은 결과가 발생합니다.
A holding the value 10 (which is 5 * 2)
and B will hold the value 15 (which is 5 + 10).
함수 서명에 & 기호가 없는 경우 함수 "twoValues"에 전달된 매개 변수에 대한 변경 사항은 해당 함수 내부에서만 볼 수 있지만 호출 프로그램(예: 메인)에 관한 한 동일합니다.
이제 포인터 매개 변수를 사용하여 함수를 호출하면 값 배열이나 목록을 전달할 때 가장 유용합니다.예:
float average ( int *list, int size_of_list)
{
float sum = 0;
for(int i = 0; i < size_of_list; i++)
{
sum += list[i];
}
return (sum/size_of_list);
}
size_of_list 매개 변수는 전달하는 배열의 요소 수입니다(바이트 단위의 크기가 아님).
이것이 도움이 되길 바랍니다.
C++는 많은 면에서 c와 다르며 참조는 그 일부입니다.
c++ 문맥의 관점에서:
void funct(int *a) // a는 포인터로 선언됩니다. 이것은 c에서 포인터의 사용과 관련이 있습니다.따라서 이 기능을 c의 기능과 비교할 수 있습니다.
void funct(int &a) // 이제 포인터(주소)만 수신합니다.이는 c++에서 참조 사용으로 이어질 것입니다...당신은 이것을 c의 그것과 연관시킬 수 없습니다.
여기 이 둘 사이의 차이점을 명확히 하는 좋은 Q&A가 있습니다.C++에서 포인터 변수와 참조 변수의 차이점은 무엇입니까?
언급URL : https://stackoverflow.com/questions/28778625/whats-the-difference-between-and-in-c
'programing' 카테고리의 다른 글
MapStruct - 구현을 찾을 수 없습니다. (0) | 2023.07.25 |
---|---|
폼을 사용하지 않고 POST 변수 설정 (0) | 2023.07.25 |
런타임에 jQuery를 사용하여 CSS 규칙/클래스 만들기 (0) | 2023.07.25 |
Python을 사용하여 기존 PDF에 텍스트 추가 (0) | 2023.07.20 |
파이썬의 요청 모듈을 사용하여 웹 사이트에 "로그인"하는 방법은 무엇입니까? (0) | 2023.07.20 |