포인터와 문자열

📒 포인터(pointer)

메모리의 주소를 가지고 있는 변수

  • 변수의 주소를 알고싶다? => & 사용

int i = 10;
char c = 69;
cout << &i;     // 변수 i가 저장된 메모리의 주소가 출력
cout << (void*)&c;  //


##포인터 선언 및 초기화 방법
1
int* ptr;
ptr = &i;

2 
int* ptr = &i;









🙌 void 포인터

void 포인터는 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장할 수 있다.
반대로 다양한 자료형으로 된 포인터에도 void 포인터를 저장할 수도 있다. 이런 특성 때문에 void 포인터는 범용 포인터라고 불린다.

단, void 포인터는 자료형이 정해지지 않았으므로 값을 가져오거나 저장할 크기도 정해지지 않았기 때문에 void 포인터는 역참조를 할 수 없다.

ptr = numPtr1;        // void 포인터에 int 포인터 저장
printf("%d", *ptr);   // 컴파일 에러. void 포인터는 역참조할 수 없음





✌ 주소는 한 가지 형식인데 포인터에 다양한 타입이 존재하는 이유

메모리상에서 주소는 동일한 크기이기 때문에 어떤 형태이든 주소의 형식은 차이가 없지만, 포인터가 가리키는 타입을 확실하게 함으로써 프로그래밍 실수를 예방하기 위해서

Tip.

  • 역참조시 괄호를 사용해서 연산자의 우선순위로 인해 계산이 꼬이는 상황 방지
    ex) (*ptr)++
  • 포인터가 선언만 되고 초기화되지 않았다면 포인터는 임의의 주소를 가르키게 됨.
    NULL로 초기화화는 편이 좋다.!

  • 배열의 이름은 포인터이다 -> 배열의 이름에다 다른 변수의 주소를 대입할 수 있을까?
    no , 배열의 이름은 포인터 상수이다. 값 변경 불가




🙌 포인터가 실제로 사용되는 경우

  1. 동적으로 할당된 메모리 사용
  2. 함수의 매개 변수로 변수의 주소를 전달
  3. 클래스의 멤버 변수나 멤버 함수 호출



✔ 1. 동적으로 할당된 메모리 사용

  • new, delete 사용
    동적 메모리의 위치 = 힙
    힙에서 할당받으면 함수가 종료되더라도 메모리 공간에서 없어지지 않기 때문에 반드시 반납해야함.

메모리의 공간

1, 코드 : 프로그램 코드 저장
2, 전역 : 전역변수 global, 정적변수 static, 배열 array, 구조체 structure 등이 저장
3, 스택 : 함수 호출 시 함수의 매개 변수와 지역 변수 생성. 함수 호출이 끝나면 자동으로 소멸
4, 힙 : 동적 할당으로 사용 가능



new 키워드가 반환하는 것은 할당된 메모리의 주소

만약 delete 키워드를 사용하여 반납하지 않을 시, 메모리 누수(memory leak)발생.




const int p1 vs int const p1
const int* p1

-> p1이 담고자하는 주소에는 const int가 저장되어 있다.



int* const p1

-> p1이 담고자하는 주소에는 int가 저장되어 있고, 이 값(주소)는 변경할 수 없다.





✔ 2. 함수의 매개 변수로 변수의 주소를 전달

참조에 의한 호출(call by reference)

1, 포인터 이용

void func(int* a, int* b){}

int main(){
int A = 10;
int B = 20;

func(&A, &B);
}

2, 레퍼런스 이용

void func(int& a, int& b){}

int main(){
int A = 10;
int B = 20;

func(A, B);
}

2가 더 깔끔하다.
함수의 매개 변수로 변수의 주소를 전달








📒 C-문자열

c++에서는 문자열의 끝이 반드시 NULL로 끝나야 한다.

  • 문자열을 나타내는 두 가지 방법.

    1. 문자 배열을 생성하고 맨 끝에 NULL문자를 추가 (NULL문자는 ASCII코드값이 0)

    2. 클래스 String 사용

char str[] = "hello";

  • 대문자는 소문자보다 아스키 코드값이 작다.

char s1[3] = "cat";
char s2[6] = "catdog";

strcmp(s1, s2) // strcmp에서는 사전 기준으로 s1이 낮으면 음수, 같으면 0,높으면 양수를 반환한다
// s1의 t이후 값이 0(NULL)이기때문에 음수가 반환된다.

좋은 웹페이지 즐겨찾기