Gae Ko's Blog

[C] 포인터 본문

프로그래밍언어/C

[C] 포인터

Gae Ko 2018. 3. 28. 03:06

>> c언어 수업 듣고 알게된 점 정리 


포인터 


JAVA에서는 포인터를 숨겼다. (c보다 고등언어)

객체생성시에 new연산자와 생성자를 이용해 메모리를 할당하면 컴퓨터내부에서 참조값(≠주소값)을 객체변수에 던져준다.


C에서는 객체라는 것이 없으니 변수 선언하는 동시에 메모리를 할당되며 주소값을 받게 된다.

각 변수를 통해 주소값에 접근하는 방법은 &(엠퍼센드) 연산자를 사용하면 됨.


&연산자 : 피연산자의 주소값을 반환


main()밖에서 main()내 변수값을 접근하고자 한다. → 포인터 사용


포인터 변수 : 변수의 주소값을 담는 변수로 선언시 *를 사용 // 포인터변수는 주소값만 가리킨다. 

ex. int* numpt; 또는 int *numpt; 상관없다. 컴파일이 인식하길 공백은 무시하기 때문.


포인터변수를 사용해서 그 저장된 주소값의 값을 접근하고자 하려면 역참조연산자(*)를 사용

1
2
3
4
5
int num = 10;
int* numpt; // 포인터변수 선언
 
numpt = # // 이제 numpt는 num의 주소값을 가리킴 
*numpt = 20// num = 20 과 매우 정확히 동일 
cs


예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
 
typedef struct{
        int _age;
        char name[10];
}Student;
int fun(int* numpt);
 
void main(){
 
        Student student;
        Student* st = &student; // 포인터변수 
 
        int num = 10;
        fun(&num); // &은 주소값을 반환
 
        student._age = 23;
        st->_age = 25// (*st)._age = 25; 동일
 
        printf("age:%d\n", student._age);
        printf("num:%d\n", num);
}
int fun(int* numpt){ // 매개변수가 포인터변수 
        *numpt = 100// 포인터변수로 값에 접근 
        return *numpt;
}
 
cs


※ C에서의 배열 구조 


배열은 선언되면 메모리 안의 연속된 공간에 그 크기만큼 존재하게 된다.

그리고 배열이름은 배열의 주소값을 저장하게 된다. 

int a[5] ; // a == &(a[0])


배열변수 a 라면 *(a+i) == a[i] 즉, &a[i] == a+i

이러한 특징은 C에서만 가능.


함수의 매개변수로 배열을 받을 경우, fun(int num[])를 fun(int* num)라고 해도 같은 의미임.


참고로 String 은 char형 배열 형태이다. 그리고 맨 마지막 공간은 \n으로 채워져있어야하고 채워져 있다.

이유는 컴파일러가 \n를 보고 배열의 끝임을 알아채기 때문이다.


// 문자열 복사 예제 p73