| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 비동기 FIFO 구조
- booth multiplier
- BSS
- ACK Polling
- Sync FIFO
- Keynote 표
- ISR
- Async FIFO
- booth algorithm
- keynote
- keynote 사용법
- c
- 곱셈기 설계
- FIFO 설계
- C언어
- asynchronous fifo
- i2c
- booth multiplier 설계
- Cortex-M3
- SPI mode
- 연산 가속기 설계
- cadence conformal eco
- keynote 도형 회전
- LinkedList
- 자료구조
- malloc
- lec check
- ARM
- LEC
- keynote 도형 복사
- Today
- Total
JINTBEAT Design Life
C언어 - 포인터 연산 본문
포인터를 대상으로 메모리의 접근을 위한 * 연산 이외에 증가 및 감소 연산도 가능하다. 그런데, 중요한 것은 증가 및 감소 연산이 가능하다는 사실이 아니고, 연산의 결과이다.


위의 코드를 실행하면 결과가 위와 같이 나온다. ptr가 int형 배열로 정의되어 있으니까 변경되는 단위도 int(4byte)이다. 따라서
ptr를 증가시키고, 줄였을 때 arr[0], arr[1], arr[2], arr[1], arr[0] 값이 차례대로 출력되게 된다.
✏️ arr[i] == *(arr+i) 라는 결론을 얻게 된다.
*(++ptr) = 20 ;
*(ptr+1) = 20;
두 문장은 모두 ptr이 가리키는 주소에서 4byte 떨어진 메모리 공간에 20을 저장하는 문장이지만, 실행 결과 이후 ptr 상태에 차이가 있다.
위는 ptr 저장 값이 4만큼 증가되어 있고, 밑의 문장은 ptr 저장 값이 그대로 이다.
✏️ 상수 형태의 문자열을 가리키는 포인터
마지막에 널 문자가 삽입되는 문자열의 선언 방식에는 두 가지가 있다. 하나는 배열을 이용하는 방식이고, 다른 하나는 char형 포인터 변수를 이용하는 방식이다.
[1] char str1[] = "Jintbeat Design" ; // 배열의 길이는 자동으로 계산된다.
[2] char * str2 = "Jintbeat Design" ;
- 이렇게 선언을 하면 메모리 공간에 문자열 "Your String"이 저장되고, 문자열의 첫 번째 문자 Y의 주소 값이 반환된다. 그리고 그 반환 값이 포인터 변수 str2에 저장된다. 그래서 str2를 char형 포인터로 선언하면, char형 문자 Y의 주소 값이 저장된다.
- str1은 계속해서 문자 J가 저장된 위치를 가리키는 상태이어야 하지만, 포인터 변수 str2는 다른 위치를 가리킬 수 있다.


그래서, 다음과 같은 출력을 확인할 수 있다.
결국 str1은 배열 선언이고, 문자열이 복사되어 str1이라는 배열에 저장되는 것이고, 수정이 가능하다.
str2는 포인터로 선언한 것이고, 보통 수정이 불가하다(정적 영역)

응용하면, 다음과 같은 코딩이 가능하다.

결과는 위와 같이 나오고, null 문자를 만날 때까지 str2 포인터 변수가 가리키는 문자를 출력하고, str2 포인터 값을 증가시킨다.
그렇게 문자열 전체를 출력할 수 있다.
✏️ 어디서든 선언할 수 있는 상수 형태의 문자열
char * str = "Const String" ; // 상수 형태의 문자열
- 위의 문장이 실행되면 먼저 문자열이 메모리 공간에 저장된다. 그리고 그 메모리의 주소 값이 반환된다.
- char * str = 0x1234 ; 와 같은 형태가 된다. 포인터 변수 str에는 주소 값 0x1234가 저장되는 것이다.
printf("Show me the money");와 같은 문장은 큰 따옴표로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후,
그 주소 값이 반환된다.
printf(0x1234); 이렇듯 printf 함순느 문자열을 통째로 전달받는 함수가 아닌, 문자열의 주소 값을 전달 받는 함수이다.
WhoAreYou("Hong"); 이 함수의 매개변수 선언은
WhoAreYou(char * str){ . . . .} 다음과 같음을 짐작할 수 있다. 실제로 전달되는 값은 문자 H의 주소 값이기 때문이다.
'🖥️ - C language' 카테고리의 다른 글
| C언어 공부 - 포인터 문제풀이 (0) | 2025.05.18 |
|---|---|
| C언어 - 포인터 배열 (0) | 2025.05.12 |
| C언어 - 포인터와 배열 (0) | 2025.05.11 |
| C언어 - 포인터 (0) | 2025.05.10 |
| C언어 - 포인터의 포인터 (0) | 2025.05.09 |