목차
제1장. C언어의 개요
1-1. C언어의 특징
1-2. C언어의 장점
제2장. C언어의 구조
2-1. C프로그램의 기본적인 구조
2-2. C프로그램의 기본요소
제3장. 기본입출력과 데이터
3-1. printf()함수
3-2. scanf()함수
3-3. printf()함수에 사용되는 자리수(필드폭) 지정포맷
3-4. 데이터 식별자
3-5. 상수
3-6. 변수와 변수형
제4장. 연산자
4-1. 산술 연산자
4-2. 논리 연산자
4-3. 관계 연산자
4-4. 비트 연산자
4-5. 기타 연산자들
4-6. 연산자의 우선순위
제5장. C언어의 제어
5-1. if(선택조건문)
5-2. switch case(구분조건문)
5-3. for(한계선반복문)
5-4. while(무한정형 선 반복문)
5-5. do while(무조건 반복 명령문)
5-6. break문
5-7. continue문
제6장. 배열과 포인터
6-1. 배열
6-2. 포인터
1-1. C언어의 특징
1-2. C언어의 장점
제2장. C언어의 구조
2-1. C프로그램의 기본적인 구조
2-2. C프로그램의 기본요소
제3장. 기본입출력과 데이터
3-1. printf()함수
3-2. scanf()함수
3-3. printf()함수에 사용되는 자리수(필드폭) 지정포맷
3-4. 데이터 식별자
3-5. 상수
3-6. 변수와 변수형
제4장. 연산자
4-1. 산술 연산자
4-2. 논리 연산자
4-3. 관계 연산자
4-4. 비트 연산자
4-5. 기타 연산자들
4-6. 연산자의 우선순위
제5장. C언어의 제어
5-1. if(선택조건문)
5-2. switch case(구분조건문)
5-3. for(한계선반복문)
5-4. while(무한정형 선 반복문)
5-5. do while(무조건 반복 명령문)
5-6. break문
5-7. continue문
제6장. 배열과 포인터
6-1. 배열
6-2. 포인터
본문내용
변수가 가지고 있는 메모리 주소를 의미한다.
■ 예제
#include
main()
{
char *ptr; ← 포인터형(문자형으로 선언)
char a; ← 문자형(일반문자형으로 선언)
a=‘X’; ← ① (‘X’를 a에 대입)
printf(“\n 변수 a의 값 : %c”, a); ← a값 X를 출력
ptr=&a ← ② 포인터변수는 주소값만 가질수 있음(a값이 저장된 주소를 포인터변수(ptr)주소에 대입)
printf(“\n 변수 *ptr의 값 : %c”, *ptr); ← 포인터(ptr)주소에 저장된데이터를 출력
printf(“\n 변수 ptr의 값 : %x”, ptr); ← 포인터변수(ptr)가 저장된 주소를 출력
*ptr=‘Y’; ← ③ Y를 포인터변수(ptr)에 데이터로 저장
printf(\n 변수 a의 값 : %c, a); ← a에 저장된값을 출력(위의 *ptr에 Y를 저장했으므로 Y출력)
printf(\n 변수 *ptr의 값 : %c, *ptr); ← 포인터(*ptr)에 저장된 데이터 Y를 출력
printf(\n 변수 ptr의 값 : %x, ptr); ← 포인터변수(ptr)가 저정된 주소를 출력
}
■ 실행결과
변수 a의 값 : X
변수 *ptr의 값 : X
변수 ptr의 값 : ffd6
변수 a의 값 : Y
변수 *ptr의 값 : Y
변수 ptr의 값 : ffd6
☞ 포인터 변수는 항상 주소값만 가질수 있다. 예제 프로그램의 ②번 명령을 살펴보면 “ptr=&a;” 포 인터변수(ptr)는 변수 “a”가지는 데이터는 대입받을수 없고 주소만을 대입받을수가 있기 때문에 주소연산자(&)기입하지 않으면 에러가 발생한다.
☞ “*ptr=a;”와 같은 명령은 정상적으로 작동한다. 왜냐하면 *ptr과 같은 명령은 주소가 아닌 데이터 (*와 함께 사용되었으므로)만을 가질수 있으며 a는 주소가 아닌 데이터를 나타내기 때문이다.
☞ 포인터 변수는 일반 변수와는 다르게 주소를 가지고 작업을 하므로 배열과 유사한 기능으로 사용 할 수도 있다. 더욱이 일차배열, 이차배열, 다차원 배열과 같이 포인터에도 일차 포인터와 이차 포인터, 다차원 포인터가 존재한다.
① 일차포인터(1차원)
하나의 주소만을 가지는 포인터 변수를 일차 포인터라고 한다. 일차 포인터는 일차 배열을 동적(Dynamic)으로 관리하기 위해서 많이 사용되며 다음과 같은 형태로 선언한다.
“*”이 하나이면 일차포인터를 의미한다
포인터변수이름이 필요하다면 콤마로 구별하여 나열할 수 있다
↘ ↘
포인터 변수형 *포인터 변수이름,.........;
↗ ↖
포인터 변수형은 C언어가 제공하는
모든형을 사용할 수 있다
선언 후에는 반드시 세미콜론을 명시한다
일차포인터의 초기화
일차 포인터 중에서 문자형 포인터는 문자열 상수(즉“ ”사용)를 사용하여 포인터를 초기화할 수 있다. 그러나 문자 상수나 숫자 상수를 사용해서는(즉{}사용) 포인터를 초기화할 수 없으므로 주의해야 한다. 문자열 상수를 가지고 초기값을 지정하는 방법은 일차배열과 동일하다.
#include
main()
{ string은 일차포인터
↙
char *string=“hongildong”;
printf(“포인터 문자열 : %s”, string);
↖
} 문자열 출력 포맷
메모리
초기값이 할당된 메모리
string이 지칭하는 메모리주소
↘
↓
↙
포인터변수 →
string
주소
h
*string
↗
o
*(string+1)
초기값으로 지정된 문자열을 주소로 조작
n
*(string+2)
g
*(string+3)
i
*(string+4)
※배열은 정적인 할당이며 포인터는 동적인 할당이다.
따라서 배열 선언할 때 크기를 명시해야 하지만 포인터는
크기를 명시할 필요가 없다
l
*(string+5)
d
*(string+6)
o
*(string+7)
n
*(string+8)
g
*(string+9)
NULL
← 자동삽입(%s 포맷)
② 이차포인터(2차원)
이차 포인터를 위한 변수형은 C 언어가 제공하는 모든 형(기본형,결합형,조합형)을 사용할수 있다. 이차 포인터는 두개의 일차 포인터가 연속적으로 연결된 형태를 가진다.
예를 들어 char **string; 명령에서
**string : string은 char(문자)형 데이터를 가진다.
*string : **string이 수록되어 있는 주소를 지칭한다.
string : *string이 수록되어 있는 주소를 지칭한다.
#include
main()
{
char **string;
char fname[]="jung", gname[]="yoon ki";
*string=fname;
*(string+1)=gname;
printf("\n%s %s",*string,*(string+1));
printf("\n%c%c%c%c", **string, *(*string+1),*(*string+2),*(*string+3));
}
실행결과)
jung yoon ki
jung
fname
fname[0]
**string
j
*(*string+1)
u
fname[1]
*(*string+2)
n
fname[2]
string
주소
*(*string+3)
g
fname[3]
*string
주소
자동삽입
NULL
fname[4]
*(string+1)
주소
gname
gname[0]
**(string+1)
y
*(*string+1)+1)
o
gname[1]
*(*string+1)+2)
o
gname[2]
*(*string+1)+3)
n
gname[3]
*(*string+1)+4)
[space]
gname[4]
*(*string+1)+5)
k
gname[5]
*(*string+1)+6)
i
gname[6]
*(*string+1)+7)
NULL
gname[7]
자동 삽입
*string문자열 “jung”이들어었는 배열(fname)의 시작 주소를 가지며 *(string+1)은 문자열“yoon ki”이 들어있는 배열(gname)의 시작 주소를 가진다. 또한 string은 *string, *(string+1)등이 들어있는 시작 주소를 가진다. 그리고 **string, *(*string+1),...등은 이중포인터가 지칭하는 데이터를 나타낸다
■ 예제
#include
main()
{
char *ptr; ← 포인터형(문자형으로 선언)
char a; ← 문자형(일반문자형으로 선언)
a=‘X’; ← ① (‘X’를 a에 대입)
printf(“\n 변수 a의 값 : %c”, a); ← a값 X를 출력
ptr=&a ← ② 포인터변수는 주소값만 가질수 있음(a값이 저장된 주소를 포인터변수(ptr)주소에 대입)
printf(“\n 변수 *ptr의 값 : %c”, *ptr); ← 포인터(ptr)주소에 저장된데이터를 출력
printf(“\n 변수 ptr의 값 : %x”, ptr); ← 포인터변수(ptr)가 저장된 주소를 출력
*ptr=‘Y’; ← ③ Y를 포인터변수(ptr)에 데이터로 저장
printf(\n 변수 a의 값 : %c, a); ← a에 저장된값을 출력(위의 *ptr에 Y를 저장했으므로 Y출력)
printf(\n 변수 *ptr의 값 : %c, *ptr); ← 포인터(*ptr)에 저장된 데이터 Y를 출력
printf(\n 변수 ptr의 값 : %x, ptr); ← 포인터변수(ptr)가 저정된 주소를 출력
}
■ 실행결과
변수 a의 값 : X
변수 *ptr의 값 : X
변수 ptr의 값 : ffd6
변수 a의 값 : Y
변수 *ptr의 값 : Y
변수 ptr의 값 : ffd6
☞ 포인터 변수는 항상 주소값만 가질수 있다. 예제 프로그램의 ②번 명령을 살펴보면 “ptr=&a;” 포 인터변수(ptr)는 변수 “a”가지는 데이터는 대입받을수 없고 주소만을 대입받을수가 있기 때문에 주소연산자(&)기입하지 않으면 에러가 발생한다.
☞ “*ptr=a;”와 같은 명령은 정상적으로 작동한다. 왜냐하면 *ptr과 같은 명령은 주소가 아닌 데이터 (*와 함께 사용되었으므로)만을 가질수 있으며 a는 주소가 아닌 데이터를 나타내기 때문이다.
☞ 포인터 변수는 일반 변수와는 다르게 주소를 가지고 작업을 하므로 배열과 유사한 기능으로 사용 할 수도 있다. 더욱이 일차배열, 이차배열, 다차원 배열과 같이 포인터에도 일차 포인터와 이차 포인터, 다차원 포인터가 존재한다.
① 일차포인터(1차원)
하나의 주소만을 가지는 포인터 변수를 일차 포인터라고 한다. 일차 포인터는 일차 배열을 동적(Dynamic)으로 관리하기 위해서 많이 사용되며 다음과 같은 형태로 선언한다.
“*”이 하나이면 일차포인터를 의미한다
포인터변수이름이 필요하다면 콤마로 구별하여 나열할 수 있다
↘ ↘
포인터 변수형 *포인터 변수이름,.........;
↗ ↖
포인터 변수형은 C언어가 제공하는
모든형을 사용할 수 있다
선언 후에는 반드시 세미콜론을 명시한다
일차포인터의 초기화
일차 포인터 중에서 문자형 포인터는 문자열 상수(즉“ ”사용)를 사용하여 포인터를 초기화할 수 있다. 그러나 문자 상수나 숫자 상수를 사용해서는(즉{}사용) 포인터를 초기화할 수 없으므로 주의해야 한다. 문자열 상수를 가지고 초기값을 지정하는 방법은 일차배열과 동일하다.
#include
main()
{ string은 일차포인터
↙
char *string=“hongildong”;
printf(“포인터 문자열 : %s”, string);
↖
} 문자열 출력 포맷
메모리
초기값이 할당된 메모리
string이 지칭하는 메모리주소
↘
↓
↙
포인터변수 →
string
주소
h
*string
↗
o
*(string+1)
초기값으로 지정된 문자열을 주소로 조작
n
*(string+2)
g
*(string+3)
i
*(string+4)
※배열은 정적인 할당이며 포인터는 동적인 할당이다.
따라서 배열 선언할 때 크기를 명시해야 하지만 포인터는
크기를 명시할 필요가 없다
l
*(string+5)
d
*(string+6)
o
*(string+7)
n
*(string+8)
g
*(string+9)
NULL
← 자동삽입(%s 포맷)
② 이차포인터(2차원)
이차 포인터를 위한 변수형은 C 언어가 제공하는 모든 형(기본형,결합형,조합형)을 사용할수 있다. 이차 포인터는 두개의 일차 포인터가 연속적으로 연결된 형태를 가진다.
예를 들어 char **string; 명령에서
**string : string은 char(문자)형 데이터를 가진다.
*string : **string이 수록되어 있는 주소를 지칭한다.
string : *string이 수록되어 있는 주소를 지칭한다.
#include
main()
{
char **string;
char fname[]="jung", gname[]="yoon ki";
*string=fname;
*(string+1)=gname;
printf("\n%s %s",*string,*(string+1));
printf("\n%c%c%c%c", **string, *(*string+1),*(*string+2),*(*string+3));
}
실행결과)
jung yoon ki
jung
fname
fname[0]
**string
j
*(*string+1)
u
fname[1]
*(*string+2)
n
fname[2]
string
주소
*(*string+3)
g
fname[3]
*string
주소
자동삽입
NULL
fname[4]
*(string+1)
주소
gname
gname[0]
**(string+1)
y
*(*string+1)+1)
o
gname[1]
*(*string+1)+2)
o
gname[2]
*(*string+1)+3)
n
gname[3]
*(*string+1)+4)
[space]
gname[4]
*(*string+1)+5)
k
gname[5]
*(*string+1)+6)
i
gname[6]
*(*string+1)+7)
NULL
gname[7]
자동 삽입
*string문자열 “jung”이들어었는 배열(fname)의 시작 주소를 가지며 *(string+1)은 문자열“yoon ki”이 들어있는 배열(gname)의 시작 주소를 가진다. 또한 string은 *string, *(string+1)등이 들어있는 시작 주소를 가진다. 그리고 **string, *(*string+1),...등은 이중포인터가 지칭하는 데이터를 나타낸다
추천자료
C언어 중간고사 성적을 읽어들여 평균, 분산, 각 점수대별 인원을 `*` 로 출력
[C언어] 배열을 이용한 희소행렬 곱셈 프로그램
[C언어]심리테스트 및 소수구하는 프로그램
2088학년도 c언어 레포트
C언어로 만든 Network Couple Tetris
C언어로 BlueMarble
c언어 구구단
c언어 오름차순입니다
c언어 프로젝트
c언어에서의 상수와 변수
[c언어]재귀함수를 이용하여 10진수를 2진수로 바꾸는 프로그램
C언어 게임 구현 - 경찰과 도둑(Police and Thief)
c언어로 만든 up and down 콘솔 게임
c언어 정렬 알고리즘 소스 입니다. -선택, 버블, 퀵 정렬, 삽입 정렬
소개글