검색결과 리스트
분류 전체보기에 해당되는 글 69건
- 2015.12.22 함수 포인터
- 2015.12.22 포인터 보충
- 2015.12.21 포인터, 문자열
- 2015.12.20 int arr[2][3]의 대해서
- 2015.12.19 포인터, 2차원 배열
- 2015.12.19 포인터, 배열
- 2015.12.19 포인터 기초(초기화 문제, 크기)
- 2015.12.18 포인터 복습(&,*)
- 2015.12.07 깊은 복사 / 앝은 복사
글
1 2 3 4 | int add(int, int); int (*padd)(int, int); // 함수 포인터 초기화 padd = add; // 함수 포인터 대입 | cs |
padd = &add 가 아니라 padd = add를 사용한다.
함수명은 수식 내에서 함수를 가리키는 주소로 자동 변환 되기 때문에 가능하다.
가리키고 있는 함수를 호출하는 방법
i = padd(5 ,4);
i = (*padd)(5, 4); // 이 방법도 가능하다.
2차원 함수 포인터도 가능하다.
글
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 |
글
'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 |
글
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 |
글
배열 포인터 정의
1 2 3 | int *nparr; //1차원 배열 포인터 int (*nparr2)[3]; //2차원 배열 포인터 int (*nparr3)[2][3]; //3차원 배열 포인터 | cs |
컴파일러의 환경에 따라서 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},{4, 5, 6}}; 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 |
글
배열 초기화 방법
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] = { 5, 3, 7}; 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] = { 5, 3, 7}; int *imsip; imsip = imsi; int a = *(imsi + 1); int b = *(imsip + 1); cout<<a<<endl; cout<<b<<endl; | cs |
'기초' 카테고리의 다른 글
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 |
글
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 |
글
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 |
글
* 개요
객체가 복사 된다는 것은 기존 객체와 같은 값을 가지는 새로운 객체를 만든다. 라는 것 객체가 가진 값 형식(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 |
RECENT COMMENT