변수의 본질은 메모리
모든 메모리는 자신의 위치를 식별하기 위한 근거로 고유번호를 갖는데, 이 번호를 메모리의 주소라 한다
변수를 이루는 세가지 요소
1) 이름이 부여된 메모리
2) 그 안에 담긴 정보
3) 메모리의 주소 ( 메모리에 저장된 주소에 관심있는 & 주소 연산자 )
#include <stdio.h>
int main(void)
{
int nData = 10;
printf("%s\n", "nData"); //nData 이름 출력
printf("%d\n", nData); //nData 값 출력
printf("%p\n", &nData); //nData 주소 출력
}
출력값
nData
10
0060FEFC
위 코드의 의미
"이름이 nData인 부호가 있는 64비트 정수형 메모리의 실제 주소는 0060FEFC이고, 그 안에 저장된 정보를 해석하면 10진 정수인 10이다."
&nData라는 연산의 의미
"이름이 nData인 메모리의 실제 주소는?"
&nData == 0060FEFC에서 네 바이트 메모리를 int형 변수로 본다.
직접지정한 주소를 확정하여 식별하는 방식
주소 연산과 정반대되는 개념의 연산자인 *간접지정 연산자
변경될 수 있는 임의의 기준주소로 상대적인 위치(주소)를 식별하는 방식
임의 대상 일정 길이(크기)의 메모리에 저장된 정보를 해석하는 방법인 자료형을 지정한다
ex) 메모리의 주소가 0x0012FF60인 메모리를 int형으로 지정한다
: 총 네 바이트의 메모리 ( 주소가 0x0012FF60, 0x0012FF61, 0x0012FF62, 0x0012FF63 인 메모리 덩어리)를 한 세트로 보고 int형 변수로 취급한다
#include <stdio.h>
int main(void)
{
int x = 10; //int형식 변수 선언 및 정의
int *pnData = &x; //변수 x를 가리키는 int형식에 대한 포인터 변수 선언 및 정의
//포인터 변수 pnData에 저장된 주소를 가진 메모리를 int형 변수로 취급
printf("x : %d\n", x);
*pnData = 20; // pnData 포인터 변수가 가리키는 대상 메모리를 int형 변수로 간접 지정하고 20을 대입
printf("x : %d\n", x);
return 0;
}
출력 값
x : 10
x : 20
pnData에 저장된 정보
이름이 x인 메모리의 주소
포인터와 배열
배열의 이름이 주소, 포인터 변수에 저장 가능
#include <stdio.h>
int main(void)
{
int aList[5] = {0};
int *pnData = aList; // 배열은 첫번째 배열 원소의 주소값이므로 포인터에 주소연산자 없이 선언 가능
printf("aList[0] : %d\n", aList[0]);
*pnData = 20; // 포인터가 가리키는 배열의 첫번째 원소에 20 대입
printf("aList[0] : %d\n", aList[0]);
return 0;
}
배열에 저장된 문자열의 길이를 측정하는 프로그램
#include <stdio.h>
#include <string.h> // strlen() 함수 사용하기 위한 헤더
int main(void)
{
char aList[] = {"words"}; //문자 배열 선언 및 초기화
char *pList = aList; //문자 배열을 가리키는 문자 포인터 벼수의 선언 및 정의
int length = 0;
while(*pList != NULL) //포인터가 가리키는 배열에 저장된 char형 데이터가 문자열의 끝을 의미하는 NULL가 될 때까지
{
pList++; //포인터 변수의 값에 저장된 주솟값을 계속 증가시키는 방법
length++; //배열의 처음부터 '\0'이 저장된 메모리가 나올 때까지 차례로 접근
}
printf("length : %d\n", length);
printf("length : %d\n", strlen(aList));
printf("length : %d\n", strlen("words"));
return 0;
}
실행결과
5
5
5
*pList++이 아니라 pList++ 인 이유는 pList 값에 저장된 aList의 주솟값을 증가(char형 크기 만큼 한칸 이동)시켜야 aList배열이 가지고 있는 char형 단어의 개수를 알 수 있음. *pList++을 하면 포인터변수가 가리키는 aList배열이 가진 값을 증가시키는 것(w에 ++를 하는 꼴)이라 배열의 값을 바꿀 때 사용해야함. 이는 배열의 주소값과 전혀 연관성이 없기 때문에 아예 말이 안됨.
#include <stdio.h>
#include <string.h> // strlen() 함수 사용하기 위한 헤더
int main(void)
{
char aList[16] = {"words"}; //문자 배열 선언 및 초기화
char *pList = aList; //문자 배열을 가리키는 문자 포인터 벼수의 선언 및 정의
while(*pList != NULL) //포인터가 가리키는 배열에 저장된 char형 데이터가 문자열의 끝을 의미하는 NULL가 될 때까지
{
pList++;
}
printf("length : %d\n", pList - aList); //null문자가 저장된 위치에서 시작위치를 빼면 문자열의 길이를 알 수 있다
return 0;
}
실행결과
5
'자바 Java' 카테고리의 다른 글
문자와 문자열 관련 함수 (0) | 2019.11.10 |
---|---|
문자열 표준 함수 / 문자열 처리 함수 (0) | 2019.10.30 |
상속 extends / 상위클래스 하위클래스 (0) | 2019.10.16 |
추상클래스 추상메서드 (0) | 2019.10.16 |
문자열 (0) | 2019.10.09 |
댓글