포인터
- 주소를 저장하는 변수= 포인터
- 포인터는 *를 통해서 선언
- c++ 은 int*
- go는 *int
- 여기서 포인터는 주소를 저장하는데 형이 중요한 이유는, 형에 의해서 이 주소부터 어디까지 메모리를 할당할 것인지 의미를 가지고 있기때문이 아닐까
- *(indirection operator)를 통해서 간접참조연산자/ 간접참조가 가능하다.
- 그 포인터를 통해서 원래 변수의 값을 역추적 가능해진다.
- go와 c++둘다 *를 포인터 변수앞에 붙임으로 변수값을 간접참조가 가능해진다
- c++은 포인터 주소의 정수연산이 가능하지만, go는 불가능하다
- int* pa, pb; == int* pa, int pb
- int *pa, *pb; == int* pa, int* pb
- c++에서는 포인터를 선언시 반드시 초기화하여서 값을 넣어줘야지 에러 발생이 줄어든다.
- 포인터는 값의 전달이 아닌, 실제 값을 저장하고있는 주소의 전달(reference pass)을 위해서 만들어졌다.
- 주소를 확인할때는 &(address operator), 그러나 실행환경이나 여러조건에 의해서 변하는 값이므로 우리가 알 수 있는 건 메모리상에서의 위치
- &를 형 뒤에 붙이면 레퍼런스로 사용가능
- int& A = a; (referenece A를 변수 a로 초기화)
- 레퍼런스 A의 주솟값은 a의 주솟값과 완전히 동일하다.
- 레퍼런스는 초기화된 값을 가르키고있고, 그렇기에 레퍼런스값에 무언가를 한다면 그것은 실제 값에 영향을 준다.
- void func(const int* p)와 같이 const제한자를 사용하면 실제 값을 받아올수는 있지만, 변경할 수 는 없다.
- 그럼 value를 그냥넘기는거랑 무슨차이?
배열(array)
- 형명 배열명[요소 개수];
- 형명 배열명[요소 개수] = {값0, 값1, ...}; 초기화
- 요소 개수가 없으면 초기화된 값만금 배열의 길이가 자동적으로 생성된다.
- 다차원 배열: 형명 배열명[ ][ ]
- 형명 배열명[ ][ ] = { { }, { } }
- 배열요소 정렬(sort)
- 배열을 통한 for이용
- go의 경우 for a := range(aList)
- c++의 경우 for (int a : aList)
- a라는 변수를 선언하고 초기화해야된다는 것은 같지만, 초기화 하는 문법자체는 다르다.
- 배열과 포인터관계
- &test[1]- 두번째 요소의 주소값
- test - 첫번째 요소의 주소값
- *test - 첫번째 요소의 주소값이 가르키는 값
- 포인터 p, p+1 - p가 가리키는 요소의 다음 요소의 주소를 구한다
- test와 같이 배열명으로 가리킨 포인터에는 다른 주소를 대입할 수 없다.
- 배열을 함수의 인수로 사용하기
- double avg(int t[]); 이러면 avg(test)이런식으로 배열명(첫 번째 요소 주소)를 인수로 넘긴다
- double avg(int* pT); 이러면 avg(test)이런식으로 동일하지만, 내부에서는 test[1]가 아닌 *(test+1)이런식으로 값을 사용
- 포인터가 배열을 가르킬때는, 첨자 연산자[]를 사용하여서 test[2] test가 가르키는 요소로부터 2번 뒤의 요소
- 문자열과 포인터관계
- 문자열 == char형 배열
- "hello" == str[0] = 'h' .... str[5] = '₩0'
- ₩0는 문자열의 마지막에 꼭 붙으며, null문자라고 표현한다.
- 그래서 길이 +1의 배열이 필요하다.
'프로그래밍 > c++' 카테고리의 다른 글
| c++배워보기(4) (0) | 2023.03.19 |
|---|---|
| c++배워보기(3) (0) | 2023.03.18 |
| c++ 배워보기(1) (0) | 2023.03.08 |