일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 |
29 | 30 | 31 |
- C# delegate
- c# 윈폼
- 유니티
- C++
- Unity
- Flutter
- vim
- 포인터
- Data Structure
- 플러터
- gitlab
- 다트 언어
- 구조체
- 도커
- jupyter
- HTML
- C언어 포인터
- github
- 깃
- Houdini
- docker
- git
- Python
- c#
- c# 추상 클래스
- c언어
- c# winform
- Algorithm
- jupyter lab
- dart 언어
- Today
- Total
목록포인터 (6)
nomad-programmer
c_arr 변수가 0x12ff78의 주소를 사용한다고 가정한다. 형 변환 연산자를 사용하여 상수를 char형 주소로 변환한 후 * 연산자를 사용하여 char형 1바이트에 접근한다. #include int main() { char c_arr[5] = { 'A', 'B', 'C', 'D', 'E' }; printf("%c %c %c %c %c\n", *(char*)0x12ff78, *(char*)0x12ff79, *(char*)0x12ff7a, *(char*)0x12ff7b, *(char*)0x12ff7c); return 0; } // 결과 /* A B C D E */ 정수 0x12ff78 ~ 0x12ff7c에 (char*) 형 변환 연산을 사용하여 char형 주소로 변환한 후 *를 붙여 메모리 자체(값)를..
열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메모리 구조를 생성할 수 있다. #include #include int main(void) { unsigned int** arr2d; unsigned int cnt2d; unsigned int cnt1d; unsigned int temp; fputs("x축 개수: ", stdout); scanf_s("%d", &temp); arr2d = (int**)malloc(temp * sizeof(int*)); //cnt2d = temp; 아래의 연산과 같음. heap영역에 동적 할당하여 _msize함수 사용 cnt2d = (_ms..
#include int main(void) { char data[3][5] = { {0,}, {0,}, {0,} }; // 2차원 배열의 주소를 저장할 수 있는 포인터 char (*ptr)[5] = data; /* char형 주소값 2개를 저장할 수 있는 배열 */ // char* ptr2[2] = { &data[0][0], &data[1][2] }; // 위의 코드와 같은 초기화 선언이다. char* ptr2[2] = { &(*(*(data+0)+0)), &(*(*(data+1)+2)) }; // data[1][1]에 5저장 (*(ptr+1))[1] = 5; // data[2][0]에 77저장 ptr[2][0] = 77; // data[2][1]에 99저장 *(*(ptr + 2) + 1) = 99; /..
대상의 크기가 정해져 있지 않은 void *형 포인터 대상의 크기를 모른다면? 이때 사용하는 것이 바로 void 키워드이다. void 키워드는 '정해져 있지 않다'는 의미를 가지고 있다. void* ptr; 이렇게 선언하면 ptr에 주소 값을 저장할 수는 있지만 해당 주소에서 값을 읽거나 저장할 때 사용하는 크기는 정해져 있지 않다. 즉 사용할 메모리의 시작 주소만 알고 끝 주소를 모를 때 사용하는 포인터 형식이다. void 포인터는 가리킬 대상의 크기를 정한 것이 아니라서 어떤 크기의 메모리가 오든지 상관 없다. 그렇다면 void * 로 선언한 포인터 변수를 주소 값만 저장하는 용도로 사용하는 것은 아니다. 적절한 형 변환을 거쳐 '사용할 크기'를 표기해 주면 일반 포인터처럼 사용할 수 있다. int ..
// 총 4바이트 0x12345678 빅 엔디안 - 리눅스, 유닉스 등은 빅 엔디안 방식이다. 큰 수의 비트부터 읽어 들이고 메모리에 저장할 때도 마찬가지로 큰 비트를 먼저 메모리에 올린다. 즉, 위의 16진수 같은 값이 있다면 0xAAA1 주소에 0x12가 올라가고 그 다음 0xAAA2 주소에 0x34 값이 올라가고 그 다음 0XAAA3 주소에 0x56 값이 올라가고 마지막 0x78은 0xAAA4 주소에 올라간다. 0xAAA4 0x78 0xAAA3 0x56 0xAAA2 0x34 0xAAA1 0x12 위의 표 처럼 메모리에 올라간다. 리틀 엔디안 - 윈도우즈는 리틀 엔디안 방식이다. 작은 수의 비트부터 읽어 들이고 메모리에 저장할 때도 마찬가지로 작은 비트를 먼저 메모리에 올린다. 0xAAA4 0x12 ..
// 일반 변수 상수화: tmp변수는 10이라는 값을 가지고 다른 값을 가질 수 없도록 상수화한다. const int tmp = 10; // 포인터 상수화 // 대상을 상수화: ptr 포인터가 tmp로 접근하여 tmp의 값을 변경하지 못하도록 상수화. 즉, // *ptr 연산으로 tmp 값을 변경하지 못한다. const int * ptr = &tmp; // 자신을 상수화: ptr 포인터는 오직 tmp의 주소 값을 가리킨다. 다른 주소를 가리키지 못하도록 상수화한다. int * const ptr = &tmp; // tmp의 주소만 가리킬 수 있고 tmp의 값을 변경하지 못한다. const int * const ptr = &tmp;