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 이용하여 사용한다.

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



댓글 없음:

댓글 쓰기