함수 포인터

기초 2015. 12. 22. 17:07
1
2
3
4
int add(intint);
int (*padd)(intint); // 함수 포인터 초기화
 
padd = add; // 함수 포인터 대입
cs

padd = &add 가 아니라 padd = add를 사용한다.

함수명은 수식 내에서 함수를 가리키는 주소로 자동 변환 되기 때문에 가능하다.


가리키고 있는 함수를 호출하는 방법


i = padd(5 ,4);

i = (*padd)(5, 4); // 이 방법도 가능하다.


2차원 함수 포인터도 가능하다.



'기초' 카테고리의 다른 글

using 키워드  (0) 2016.03.02
시스템  (0) 2016.01.18
포인터 보충  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
int arr[2][3]의 대해서  (0) 2015.12.20
posted by 알쿠미

포인터 보충

기초 2015. 12. 22. 02:55

arr[i] ==  *(arr + i);

i[arr] ==  *(i + arr);


그러므로 []는 연산자이다.


피 연산자[피 연산자]

하나의 피 연산자는 기본 메모리 번지를 뜻하고

나머지 피 연산자는 기본 메모리 번지에서 얼마만큼 떨어져 있는지를 나타낸다.

정수는 피 연산자의 위치라면 어디에 있든지 상관 없다.


NULL문자 '\0' 과 NULL 포인트는 다르다.


NULL포인터는 에러를 처리할 때, 매개변수의 마지막을 알릴 때 사용한다.

'기초' 카테고리의 다른 글

시스템  (0) 2016.01.18
함수 포인터  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
posted by 알쿠미

포인터, 문자열

기초 2015. 12. 21. 01:14

'a' 는 문자 하나

"a" 는 맨뒤에 널문자가 들어있는 문자열

따라서

포인터 변수에는 "a"가 들어갈수 잇지만 'a'가 들어갈수 없고

char 변수에는 'a'가 들어갈수 있지만 "a"가 들어갈 수 없다.


1
2
3
char *string = "string"// 이 변수는 상수가 된다고 한다.

char string[] = "string" 
//위에 식은 string[1] 이런식으로 값에 접근해서 수정이 가능하다.
 
cs


은 엄연히 다르다.

배열과 포인터와 관계로 보면될듯하다.


포인터는 문자열의 가장 앞에 부분을 가리키고 있다고 보면 될듯 하다.

'기초' 카테고리의 다른 글

함수 포인터  (0) 2015.12.22
포인터 보충  (0) 2015.12.22
int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
posted by 알쿠미

int arr[2][3]의 대해서

기초 2015. 12. 20. 19:09



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
    printf("%x %d\n", narr, sizeof(narr));
    // 배열명으로 가장 첫번째가 저장된 곳 배열의 전체를 가리키고 있는값
    // 출력 값 : 주소값 24(3*2*4)
    printf("%x %d\n"&narr, sizeof(&narr));
    //narr 이 가리키고 있는 주소값이고 위에 값이랑 같다. 그리고 가리키고있는 값이 주소값 따라서
    // 출력 값 : 주소값 4(가리키는 값이 아니라 그냥 주소값(포인터 크기)
    printf("%x %d\n", narr[0], sizeof(narr[0]));
    //narr[0]은 행을 대표하는 주소 값은 narr과 같다.
    // 출력 값 : 주소값(narr과 같다) 12(행을 대표하기 때문에(3*4))
    printf("%x %d\n"&narr[0], sizeof(&narr[0]));
    //2번의 결과와 같다.
    printf("%x %d\n", narr[1], sizeof(narr[1]));
    printf("%x %d\n", narr[2], sizeof(narr[2]));
    // 결과 값 : 주소값 12(행을 대표하기때문에)
 
    printf("%x %d\n"&narr[1], sizeof(&narr[1]));
    printf("%x %d\n"&narr[2], sizeof(&narr[2]));
    // 결과 값 : 주소값 4(주소크기)    
 
    printf("%x %d\n", narr[0][0], sizeof(narr[0][0]));
    printf("%x %d\n", narr[0][1], sizeof(narr[0][1]));
    //쓰레기값  4(가리키는 변수크기)
 
    printf("%x %d\n"&narr[0][0], sizeof(&narr[0][0]));
    printf("%x %d\n"&narr[0][1], sizeof(&narr[0][1]));
    //주소값  4(주소크기)
cs




'기초' 카테고리의 다른 글

포인터 보충  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
posted by 알쿠미

포인터, 2차원 배열

기초 2015. 12. 19. 03:56

배열 포인터 정의

1
2
3
int    *nparr;                //1차원 배열 포인터
int    (*nparr2)[3];       //2차원 배열 포인터
int    (*nparr3)[2][3];  //3차원 배열 포인터
cs
위의 포인터들은 모두 4바이트이다. 2차원이라고 8바이트되는 것이 아니다.

컴파일러의 환경에 따라서 64비트면 포인터 크기는 8바이트라고 한다.

운영체제가 64비트라도 컴파일러가 32비트면 4바이트이다.

운영체제에서 32비트 호환을 지원하기 때문이라고 한다.

앞에 행이 몇개인지는 중요하지 않다.


1
2
3
4
5
6
7
8
9
10
11
int    narr[2];
int    *nparr;
 
cout<<sizeof(narr)<<endl;
cout<<sizeof(nparr)<<endl;
cout<<sizeof(*nparr)<<endl;
 
출력결과 : 
8
4
4
cs

narr의 크기는 배열 전체의 크기이므로 4*2 = 8 이고

nparr의 크기는 포인터이므로 4이고

*nparr의 크기는 가리키는 것에 대한 크기이다.


1
2
3
4
5
6
int    narr[3][2];
int    (*nparr)[2];
 
1) nparr = narr;
2) nparr = narr[0];
3) nparr = &narr[0][0];
cs

nparr은 배열을 대상으로 한 포인터 이기때문에 2), 번과 3)번과 같은 형태는 대입 되지 않는다.

2)번과 3번은 배열이라기 보다는 첫번째 값의 주소와 같은 개념이므로. 배열을 대상으로한 포인터가 아니다.


int narr[2][3] 이라는 것에서

sizeof(narr) == 2*3*4;

sizeof(narr[0]) == 3*4; // 행을 다 가르키기 때문에

엄연히 narr과 narr[0]는 다르다.


1
2
3
4
5
6
7
8
9
 
    int narr[2][3= {{1,2,3},{456}};
    int *nparr1;
    int (*nparr2)[3];
 
    nparr1 = &narr[0][0];
    nparr2 = narr;
 
    cout<<*(*(nparr2+1)+2)<<endl;
// 안에 덧셈은 행 증가 뒤에 덧셈은 열증가
cs

2차원 배열 포인터 대입 방법

nparr1 은 아무리 2차원 배열 처럼 더해도 1차원이라서 하나씩 증가된다.(배열의 끝까지 증가가능)

포인터는 계속 증가하면 배열의 끝까지 계속 갈수 있다.

2차원 배열 포인터는 증가하면 행이 증가된다.




'기초' 카테고리의 다른 글

포인터, 문자열  (0) 2015.12.21
int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
posted by 알쿠미

포인터, 배열

기초 2015. 12. 19. 01:11

배열 초기화 방법

1
2
int  imsi[3= {0};// 1차원 배열 초기화
int  imsi[2][3= {{1,2,3}, {이부분은 0으로 초기화}}; //2차원 배열 초기화
cs


1
2
3
4
5
6
7
int    imsi[3= { 537};
int    *imsip;
 
imsip = imsi; 
 
1. 배열명은 주소를 뜻한다.
2. 배열명은 배열의 첫번째 배열요소의 주소를 뜻한다.
cs

따라서 imsi == &imsi[0] imsip는 imsi[0]를 가리키고 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
    int    imsi[3= { 537};
    int    *imsip;
 
    imsip = imsi;
 
    int a = *(imsi + 1);
    int b = *(imsip + 1);
 
    cout<<a<<endl;
    cout<<b<<endl;
cs

배열을 가리키는 포인터에 +1을 하면 다음 값을 가리킨다.
다음의 출력 값은 3이 2번 출력된다.

imsip++ 은 되지만 imsi++은 되지 않는다.(imsi는 변경할 수 없기 때문)
배열명에는 주소를 할당할 수 없다. 배열명은 포인터 변수가 아니라 배열명 자체일 뿐이다.








'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
깊은 복사 / 앝은 복사  (0) 2015.12.07
posted by 알쿠미

포인터 기초(초기화 문제, 크기)

기초 2015. 12. 19. 00:18
1
2
3
4
5
    int *nptr;
    int a = 5;
 
    *nptr = 5// 초기화 되지않은 변수 오류
    *nptr = a; // 초기화 되지않은 변수 오류
cs

포인터는 주소를 지정하고 사용해야한다.

1
2
3
4
5
6
7
8
9
    int                 int_;         //4바이트
    float             float_;        //4바이트
    double         double_;    //8바이트
    char            char_;        //1바이트
 
    int                *intp;        //4바이트
    float            *floatp;    //4바이트
    double            *doublep;    //4바이트
    char            *charp;        //4바이트
cs


모든 포인터 변수는 4바이트를 가진다.

'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
깊은 복사 / 앝은 복사  (0) 2015.12.07
posted by 알쿠미

포인터 복습(&,*)

기초 2015. 12. 18. 03:50
1
2
3
4
5
6
7
8
9
10
    int *nptr;
    int a = 5;
 
    nptr = &a;
 
    cout<<"&a : "<<&a<<endl;
 
    cout<<"nptr : "<<nptr<<endl;
    cout<<"&nptr : "<<&nptr<<endl;
    cout<<"*nptr : "<<*nptr<<endl;
cs

결과



&는 주소값

*는 가리키는값


포인터 변수에 주소값을 넣기 위해서 마련된 것이 &연산자이다.

'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
깊은 복사 / 앝은 복사  (0) 2015.12.07
posted by 알쿠미

깊은 복사 / 앝은 복사

기초 2015. 12. 7. 20:56

* 개요

 객체가 복사 된다는 것은 기존 객체와 같은 값을 가지는 새로운 객체를 만든다. 라는 것 객체가 가진 값 형식(Value Type)과 참조형식(Reference Type)의 복제 방식에 따라 얕은복사와 깊은복사로 개념이 나뉜다.

* 얕은 복사(Shallow Copy)

참조하는 것으로 값 자체를 복사해 놓은 것이 아니기 때문에 참조하는 것을 삭제할 경우를 잘 고려해야한다. ex) 복사생성자

* 깊은 복사(Deep Copy)

값 자체를 복사하는 경우로서 각각 다른 메모리 공간을 할당하기 때문에 얕은 복사에서와 같은 삭제시의 문제점은 없다.


'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
posted by 알쿠미