2020. 4. 25.

[자료구조] 인프런 1. c언어 기초 문법 리뷰 - 배열, 포인터., 문자열, 동적메모리 할당 강의 정리


기초 문법 리뷰

*메모리

컴퓨터의 메모리는 테이블을 보관하는 장소
바이트(8 bits) 단위로 주소가 지정됨
모든 변수는 주소를 가짐


*포인터

포인터(pointer)는 메모리 주소를 값으로 가지는 변수이다. 포인터 변수는 다음과 같이 선언된다.

type-name * vairable-name;

vairable-name은 선언된 포인터 변수의 이름이며, * 는 variable-name이 포인터 변수임을 표시하고, type-name은 포인터 변수 variable-name에 저장될 주소에 저장될 데이터의 유형을 지정

int * ptr;

연산자 &는 변수로부터 그 변수의 주소를 추출하는 연산자이다.


p = %c를 저장할 수 있는 이유는 p가 *p로 선언되어 포인터변수이기 때문이다.

int 
int 
• ip; 
.1 
ip = &x 
1036 
1032 
1028 
1024 
1020 
1016 
1012 
1008 
1004 
1000 
1 
2 
1028 
x 
ip 
1036 
1032 
1028 
1024 
1020 
1016 
1012 
1008 
1004 
1000 
1 
1 
1028 
x 
ip 
1036 
1032 
1028 
1024 
1020 
1016 
1012 
1008 
1004 
1000 
o 
2 
1028 
x 
ip 
int x=l, 
int * ip; 
ip = &x;

x 라는 변수가 10248번지에 할당되고
y 라는 변수가 1024번지에 할당되었다
ip 라는 변수가 1008번지라는 주소에 할당되었다.
ip = &x;
x의 주소를 포인터변수 ip에 저장을 해라
1028라는 주소가 ip포인터변수에 저장이 된다

*는 포인터변수라는 기호의 역할을 한다
일반문장에서 어떤 포인트변수앞에 *가 등장하면
포인터변수가 저장하고 있는 주소,
그 주소에 저장된 값이나 혹은 그 주소가 참조하는 자리를 의미
*에 해당하는 치환문이 오른쪽에 등장하느냐 왼쪽에 등장하느냐에 따라 구분된다.

y=*ip
*ip는 1이라는 값을 표현한다. 1을 변수 y에 저장하도록 해라
y=*ip=1 과 같은 의미를 두게 된다.

*ip= 0;
*가 치환문의 왼쪽에 등장하게 될 경우
ip는 포인터의 변수이다.
ip라는 포인터변수 자체가 아니라 ip주소가 현재 저장하고 있는 주소
그 주소에 0을 써라
현재 ip주소가 1028이고 이것은 즉 1028번지에 0을 써라
현재 1028번지의 주소는 x이다.
x=0 을 써라 와 같다


*포인터와 배열

포인터와 배열은 매우 긴밀히 연관되어 있다.
예를 들어 다음과 같이 선언된 배열 a가 있다고 하자.

배열의 이통은 
배임의 시작 주소를 저장하 
는 포인터 년수임 
(단 그 값을 변경할 수 없음) 
Int a 10 
기미 비원 
10져의 정수를 수용할 수 있는 
매도리 (40비이니기 할당딕

int a[10];
정수형 변수 a에 10칸짜리 배열을 만든다.

a라는 또다른 하나의 변수가 만들어진다.
배열의 이름은 또다른 하나의 변수의 이름이 a다
그럼 a라는 변수는 무엇이냐
a라는 변수는 포인터 변수여서 이 변수는 이 배열의 시작주소
시작주소라는 것은 이 10칸짜리 배열의 첫번째칸에 a[0]의 주소가
포인터변수 a에 저장이 된다.

*예제

<stdåO . 
int main(vo 
int sum, i, average; 
int num[løl; 
for i - 
Lcuia ) : 
erage = 
average); 
int •my ) 
int te_s 
int Sum, 
for ( i

*포인터 arithmetic

*a와 a[0]은 동일한 의미이다.
또한 a[1]은 *(a=1)과 동일하고, a[i]는 *(a+i)와 동일하다.

int a[10];

희이 41] 
이 런 프읜「=f arithmeticOla-f고 부E나갔

*동적메모리 할당

변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당 할 수 있다. 이것을 동적 메모리 할당(dynamic memery allocation)이라고 부른다.
malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다.

malloc 함수 
1월,환|하는 주소는 니굏CⅠ 유는 주소(mid 월이나』 서수i물 시 
들•하거 위하시 이것을 int •로 변환|흰|대 반드시 월요신 아니다 
&렇월를 예e리의 그기ㆍ 파*단의7 징한디. 여기서는 10기l의 
섬수를 시들하기 최대시 翩바이틔 요청히있나- 
P= (int *)譱111°c(40); 
if (鬱= NULL) { 
/& 동적 메모리 환담이 실파 */ 
/• 적절한 조치를 취한다. •/ 
• 12; 
9[1] 
*|疑으로 할광받은 거포 리는 0鸞,| 보통의 배권 
처 시晷한다|

*배열키우기

동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있다.

int * array = (int *)malloc(4*sizeof(int));

/*배열 array으 크기가 부족한 상황이 발생한다. */

int * temp =(int *)malloc(8*sizeof(int));
int i;
for(i=0; i<4 i="" p="">
 tmp[i] = array[i];

array=temp;


malloc 함수를 쓸때는 sizeof를 이용하여 사용한다.

크기를 키울수 있는 경우에는 배열로 선언하면 안된다.



댓글 없음:

댓글 쓰기