★ 4장_1번예제
#include <iostream>
using namespace std;
int main ()
{
int sum, i;
for (i=1; i<=10; i++)
sum=sum+i;
cout << "1-10 까지의 합" << sum << endl;
return 0;
}
● 주석 & 과정
- 초기화 되지 않았다 그래서 경고
- i는 이부분에서 초기화가 이루어지기에 경고는 없다
- sum의 초기화 안된 것을 쓰려고 하니 에러가 난다.
● 결과 & 스크린샷
★ 4장_2번예제
#include <iostream>
using namespace std;
int main ( )
{
int sum =0, i=0;
for (i=1; i <=10; i++)
sum=sum+i;
cout << "1 - 10 까지의 합" << sum << endl;
return 0;
}
● 주석 & 과정
- 여기서는 sum과 i가 모두 초기화 되었다.
- 초기화가 되었기 때문에 아무런 문제없이 연산 대입이 가능하다.
- 그리고 결과 출력
● 결과 & 스크린샷
★ 4장_3번예제
#include <iostream>
using namespace std;
int main()
{
int a=100;
cout << "a 어| 저장된 값" << a << endl;
cout << "a의 주소"<< &a << endl;
return 0;
}
● 주석 & 과정
- int a를 선언하고 100으로 초기화한다.
- a를 출력
- a의 주소를 출력
● 결과 & 스크린샷
★ 4장_4번예제
#include <iostream>
using namespace std;
int main ()
{
int a=100;
int *pa;
pa=&a;
cout << "a의 저장된 값" << a << endl;
cout << "a의 주소 "<< &a << endl;
cout <<"******************************"<< endl;
cout << "a에 저장된 값" << *pa << endl;
cout << "a의 주소 "<< pa << endl;
return 0;
}
● 주석 & 과정
// int a를 선언하고 100으로 초기화
// int 포인트변수 pa를 선언한다.
// 포인트 변수 pa에 a변수의 주소를 넘겨준다.
// a변수 출력
//a의 주소를 출력
// pa가 가르키고 있는 주소의 값을 출력
// pa에 저장된 주소를 출력
● 결과 & 스크린샷
★ 4장_5번예제
#include <iostream>
using namespace std;
int main ( )
{
int a=100;
int *pa;
pa=&a;
cout << a << endl;
cout << &a << endl;
cout << pa << endl;
cout << *pa << endl;
return 0;
}
● 주석 & 과정
- int a를 선언하고 100으로 초기화
- int 포인트 변수 pa를 선언
- 포인트 변수 pa에 a변수의 주소를 넘겨줌
- a의 값 출력
- a의 주소 출력
- pa가 가지고 있는 주소 출력
- pa가 가르키고 있는 주소의 값 출력
● 결과 & 스크린샷
★ 4장_6번예제
#include <iostream>
using namespace std;
int main()
{
int b=300;
int *pb=&b;
cout << b << endl;
cout << pb << endl;
b=200;
cout << *pb << endl;
cout << &b << endl;
return 0;
}
● 주석 & 과정
- int b를 선언하고 300으로 초기화
- int 포인트변수 pb를 선언하고 b의 주소를 넘겨받음
- b의 값 출력
- pb가 가르키고 있는 주소 출력
- b의 값 200으로 수정
- pb가 가르키고 있는 값을 출력
- b의 주소 출력
● 결과 & 스크린샷
★ 4장_7번예제
#include <iostream>
using namespace std;
int main()
{
int jumsu1 , jumsu2 , jumsu3;
int score[3];
cout << "jumsu1 의 주소" << &jumsu1 << endl;
cout << "jumsu2 의 주소" << &jumsu2 << endl;
cout << "jumsu3 의 주소" << &jumsu3 << endl;
cout << "******************************************" << endl;
cout << "score[0] 의주소" << &score[0] << endl;
cout << "score[1] 의 주소" << &score[1] << endl;
cout << "score[2] 의주소" << &score[2] << endl;
cout << "******************************************" << endl;
for (int i=0; i<3; i++)
cout << "score[" << i << "] 의 주소" << &score[i] << endl;
return 0;
}
● 주석 & 과정
- int 형 jumsu1,2,3 을 선언
- int형 score[3]배열 선언
- jumsu1의 주소
- jumsu2의 주소
- jumsu3의 주소
- score[0]의 주소
- score[1]의 주소 4바이트씩 주소가 이동됨
- score[2]의 주소 4바이트씩 주소가 이동됨
- 배열의 각 요소에 대한 주소 출력
● 결과 & 스크린샷
★ 4장_8번예제
#include <iostream>
using namespace std;
int main ()
{
int score[3]={99 , 88 , 100};
cout << "score[O] 의주소" << &score[0] << endl;
cout << "score[l] 의 주소" << &score[1] << endl;
cout << "score[2] 의 주소" << &score[2] << endl;
cout << "****************************************** " << endl;
for (int i=0; i<3; i++)
cout << "score [" << i << "] 의 주소 " << &score[i] << endl;
cout << "******************************************" << endl;
cout << "score[O] 의 주소 " << score << endl;
cout << "score[l] 의주소" << score+ 1 << endl;
cout << "score[2] 의 주소" << score+2 << endl;
cout << " ******************************************" << endl;
for (int i=0; i<3; i++)
cout << "score[" << i << "] 의 주소" << score+i << endl;
return 0;
}
● 주석 & 과정
- int형 배열변수 score[3]선언과 동시에 초기화
- score[0]의 주소 출력
- score[1]의 주소 출력
- score[2]의 주소 출력
- score의 각 요소 반복문으로 모두 출력
- 배열의 이름은 시작주소를 가지고 있기에 score[0]의 주소 출력
- 배열의 이름은 모배열 혹은 상수포인터이다 포인터에 +1을 하면 대상 자료형의 크기만큼 주소가 이동된다.
- 배열의 이름은 모배열 혹은 상수포인터이다 포인터에 +1을 하면 대상 자료형의 크기만큼 주소가 이동된다.
- 배열의 이름은 모배열 혹은 상수포인터이다 포인터에 +1을 하면 대상 자료형의 크기만큼 주소가 이동된다.
● 결과 & 스크린샷
★ 4장_9번예제
#include <iostream>
using namespace std;
int main ()
{
int weight[5]={68 , 54 , 45 , 87 , 96};
int s[5]={0 ,};
int a[5]={5 , 4 , };
int i=0;
for (i=0; i<5; i++)
cout << "weight[" << i <<"] "<< weight[i] << endl;
cout << "****************************************** " << endl;
for (i=0; i<5; i++)
cout << "s[" << i <<"] "<< s[i] << endl;
cout << "****************************************** " << endl;
for (i=0; i<5; i++)
cout << "a[" << i << "] "<< a[i] << endl;
return 0;
}
● 주석 & 과정
- int형 weight 배열[5]를 선언과 동시에 초기화
- int형 s[5]배열 선언과 동시에 0을 모두 초기화
- int형 a[5]배열 선언과 동시에 인덱스 0과 1의 초기화 후 나머진 0으로 초기화
- weight 각 요소 출력
- s 각 요소 출력
- a 각 요소 출력
● 결과 & 스크린샷
★ 4장_10번예제
#include <iostream>
using namespace std;
int main()
{
int score[4]={0 ,};
int i=0;
for (i=0; i<3; i++)
{
cout << " 점수" << i+1 << " 입력 : ";
cin >> score[i];
score[3]=score[3]+score[i];
}
for (i=0; i <4; i++)
cout << score[i] << " " ;
cout << endl;
return 0;
}
● 주석 & 과정
- 배열변수 선언하고 모두 0으로 초기화
- 변수 선언하고 0으로 초기화
- 입력을 받음
- 배열 마지막번에다가 차례차례 합계를 누적시킴
- 배열의 모든 요소를 출력함.
● 결과 & 스크린샷
★ 4장_11번예제
#include <iostream>
using namespace std;
int main ( )
{
char string[30] = "computer" ;
int i=0;
cout << string << endl;
for (i=0; string[i]!= '\0'; i++)
cout << string[i];
cout << endl;
return 0;
}
● 주석 & 과정
- char형 배열 변수 [30] 선언"computer"로 초기화
- i을 선언하고 0으로 초기화
- string 출력 "computer" 출력
- i는0으로 수정 하고 string[i]가 '\0'고 다르면 반복 하고 i++
- string[i]에 들어있는 문자를 출력
● 결과 & 스크린샷
★ 4장_12번예제
#include <iostream>
using namespace std;
int main ()
{
char string[20]="C++ prograrruning is very interesting!!!";
cout << string << endl;
return 0;
}
● 주석 & 과정
char를20개 선언 했지만 초기화의 문장이 선언한것보다 많아서 오버풀로우에러가 난다.
● 결과 & 스크린샷
★ 4장_13번예제
#include <iostream>
using namespace std;
int main()
{
char string[100]="C++ prograrmning is very interesting!!!";
cout << string << endl;
return 0;
}
● 주석 & 과정
배열의 원소를 충분히 잡아줬으므로 오버플로우 에러가 안난다.
● 결과 & 스크린샷
★ 4장_14번예제
#include <iostream>
using namespace std;
int main ( )
{
char ch= 'y', name [30] = "KabDo1" ;
cout << &ch << endl;
cout << name << endl;
cout << &name[0] << endl;
return 0;
}
● 주석 & 과정
문자열을 출력할 경우 문자열의 첫 번째 문자 시작 주소를 알려주면 널 문자가 표시된 곳까지
출력되었다. 그래서 문자가 저장된 주소를 cout을 이용해서 아무런 표식 없이 사용하면 문자열로 간주하여 널 문자가 있는 곳까지 메모리에 접근한다.
- char형으로 ch를 선언 'y'초기화 name[30] 선언"KabDo1" 초기화
- cout으로 아무런 표식 없이 문자의 시작주소를 알려주면 문자열로 알고 널이 나올대까지 메모리에 접근 그래서 이상하게 출력이 되는 것
- cout으로 아무런 표식 없이 문자의 시작주소를 알려주면 문자열로 알고 널이 나올대까지 메모리에 접근그래서 배열의 시작주소를 뜻하는
- 배열이름만으로도 모든 원소가 나오는 것임
- 이하동문
● 결과 & 스크린샷
★ 4장_15번예제
#include <iostream>
#include <string>
using namespace std;
int main()
{
char ch= 'y' , name [30] = "KabDol" ;
cout << hex << (int)&ch << endl;
cout << hex << (int)name << endl;
cout << hex << (int) &name[0] << endl;
return 0;
}
● 주석 & 과정
- 할당 및 초기화
- cout으로 문자의 시작주소를 주면 널이 나올때까지 메모리 에 접근하므로 그것을 피하기 위해 형변환을 한다.
- cout으로 문자의 시작주소를 주면 널이 나올때까지 메모리 에 접근하므로 그것을 피하기 위해 형변환을 한다.
- cout으로 문자의 시작주소를 주면 널이 나올때까지 메모리 에 접근하므로 그것을 피하기 위해 형변환을 한다.
● 결과 & 스크린샷
★ 4장_16번예제
#include <iostream>
using namespace std;
int main ( )
{
char s_str [30] ="", d_str [30] ="" ;
int i=0;
cout << "주민등록번호 입력:";
cin>> s_str;
for (i=0; s_str[i]!= '\0'; i++)
d_str[i]=s_str[i];
d_str[i]=s_str[i];
cout << s_str << endl;
cout << d_str << endl;
return 0;
}
● 주석 & 과정
- 선언과 초기화
- 입력
- s_str[i]이 \0이 아니면 반복 그리고 i++
- d_str[i]에 =s_str[i]를 복사
- 마지막 널까지 복사
- 출력
● 결과 & 스크린샷
★ 4장_17번예제
#include <iostream>
using namespace std;
int main()
{
char s_str[30]="" , d_str[30]= "";
int i=0;
cout << " 주민등록번호 입력 : ";
cin>> s_str;
strcpy(d_str, s_str);
cout << s_str << endl;
cout << d_str << endl;
return 0;
}
● 주석 & 과정
- 선언 초기화
- 입력받음
- strcpy는 원본배열을 대상배열에 복사하는 함수 즉 복사함
- 출력
'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To dis deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
같은 경고가 나는데 이것은 strcpy함수가 안전하지 않을 수도 있으니 대신 strcpy_s()를 사용하기를 권고 하고 있다는 뜻이다. 이는 기존 문자열 관련 함수에서 보안성에 문제가 발생하여 이를 보완한 함수를 다시 정의했기 때문에 새로 작성된 함수 사용을 권하고 있는 것이다.
● 결과 & 스크린샷
★ 4장_18번예제
#include <iostream>
using namespace std;
int main ( )
{
char s_string[100]="C++ prograrrnning is very interesting!! !";
char d_string[100];
cout <<"s_string "<< s_string << endl;
strcpy_s(d_string, _countof(d_string) , s_string);
cout << "d_string " << d_string << endl;
strncpy_s(d_string, _countof(d_string) , s_string, 3);
cout <<"d_string "<< d_string << endl;
strcat_s (d_string, _countof (d_string) , "*****");
cout <<"d_string "<< d_string << endl;
strncat_s(d_string, _countof(d_string) , s_string, 3);
cout <<"d_string "<< d_string << endl;
return 0;
}
● 주석 & 과정
- _countof(d_string) 사이즈 만큼 d_string에 s_string을 복사하는것이다.
- _countof(d_string) 사이즈 만큼 d_string에 s_string을 Maxcount 개수만큼 복사하는것이다. 이때 d_string은 _countof(d_string) 만큼의 기억장소가 할당된 상태
- 문자열 "*****"을 d_string에 덧붙인다
- _countof(d_string) 사이즈 만큼 d_string에 s_string을 Maxcount 개수만큼 복사하는것이다. 이때 d_string은 _countof(d_string) 만큼의 기억장소가 할당된 상태
● 결과 & 스크린샷
★ 4장_19번예제
#include <iostream>
using namespace std;
int main()
{
char jumin[30]={0 ,};
char year[5]={0 ,}, month[3]={0 ,}, day[3]={0 ,};
cout << " 주민등록번호 입력 :" ;
cin >>jumin;
if (jumin[6]== '1' || jumin[6] =='2' )
strcpy_s(year, _countof(year) , "19");
else
strcpy_s(year, _countof(year) , "20");
strncat_s(year , _countof(year) , jumin, 2);
strncpy_s(month, _countof(month) , jumin+2 , 2);
strncpy_s(day, _countof(day) , jumin+4 , 2);
cout << "당신의 생일은" << year<< "년" << month << "월 " << day << "일입니다 " << endl;
return 0;
}
● 주석 & 과정
- 선언과 초기화
- 선언과 초기화
- 주민등록번호 입력
- jumin[6]이 '1'이거나 '2'이면 //책엔 [7]이라 나오지만 사실[6]이 아니였을까?
- year에다가 "19"를 넣어줌
- 아니면
- year에다가 20을 넣어줌
- year에다가jumin을 2만큼 덧붙여줌
- month에다가 jumin+2여기서 2는 인덱스.... 를 2만큼 덧붙여줌
- day에다가 jumin+4 여기서 4는 인덱스 ... 를 2만큼 덧붙여줌
● 결과 & 스크린샷
★ 4장_20번예제
#include <iostream>
using namespace std;
int main()
{
int *pi;
char *pc;
float *pf;
double *pd;
cout << " 정수형 포인터 크기 " << sizeof(pi) << endl;
cout << " 문자형 포인터 크기 " << sizeof(pc) << endl;
cout << " 실수형 포인터 크기 " << sizeof(pf) << endl;
cout << " 배정도형 포인터 크기 " << sizeof(pd) << endl;
return 0;
}
● 주석 & 과정
- 인트형 변수의 주소를 받을 포인터형 변수 선언
- char 변수의 주소를 받을 포인터형 변수 선언
- float 변수의 주소를 받을 포인터형 변수 선언
- double형 변수의 주소를 받을 포인터형 변수 선언
- sizeof는 해당 변수의 사이즈를 알려주는 함수 포인터는 자료형에 상관없이 4바이트라 4바이트 출력
- sizeof는 해당 변수의 사이즈를 알려주는 함수 포인터는 자료형에 상관없이 4바이트라 4바이트 출력
- sizeof는 해당 변수의 사이즈를 알려주는 함수 포인터는 자료형에 상관없이 4바이트라 4바이트 출력
- sizeof는 해당 변수의 사이즈를 알려주는 함수 포인터는 자료형에 상관없이 4바이트라 4바이트 출력
● 결과 & 스크린샷
★ 4장_21번예제
#include <iostream>
using namespace std;
int main ( )
{
int *pi , i=100;
pi=&i;
cout <<"pi " << pi << "pi+1 " << pi+1 << endl;
return 0;
}
● 주석 & 과정
- 포인트 변수와 일반 변수(앞 포인터 뒤 일반변수) 선언과 초기화
- 포인터변수 pi에 i변수의 주소를 넘겨줌
- pi의 주소와 pi+1의 주소를 보여주는데 pi에 +1하면 해당 자료형의 자료크기만큼 주소 이동.
● 결과 & 스크린샷
★ 4장_22번예제
#include <iostream>
using namespace std;
int main ()
{
int a=100;
int &ra=a;
cout << "a= " << a << endl;
cout << "ra=" << ra << endl;
cout << "****************" << endl;
ra=200;
cout << "a= " << a << endl;
cout << "ra=" << ra << endl;
cout << "a= " << &a << endl;
cout << "ra=" << &ra << endl;
return 0;
}
● 주석 & 과정
레퍼런스 변수는 이미 선언된 변수를 다른 이름으로 부르는 변수이다. 따라서 레퍼런스 변수는 변수 선언에서 반드시 어떤 변수를다른 이름으로부르는가를명시해야한다. 즉반드시 초기화가 함께 이루어져야 한다. 레퍼런스 변수는 선언에서 레퍼런스 변수를 나타내는 기호인 주소지정 연산자(&)를 함께 표시한다.
- a변수를 ra로 부르겠노라 명시한다.
- a의 값 출력
- ra값 출력 위아래 둘다 값은 동일할 것이다
- ra에 200으로 수정
- a 값 출력
- ra 값 출력 위아래 똑같을 것이다 a건 ra건 동일하기 때문
- a 값 출력
- ra 값 출력 위아래 똑같을 것이다 a건 ra건 동일하기 때문
● 결과 & 스크린샷
★ 4장_23번예제
#include <iostream>
using namespace std;
int main ( )
{
int *pi = new int;
*pi=100;
cout << *pi << endl;
delete pi;
int *pj = new int[3];
int i;
pj[0]=10;
pj[1]=20;
pj [2]=30;
for (i=0;i<3; i++)
cout <<pj[i] << endl;
delete [] pj;
return 0;
}
● 주석 & 과정
- 동적할당을 한다.
- 동적할당을 한곳에 100을 넣는다.
- 출력한다 100이 출력된다.
- 동적할당된 메모리를 해제한다.
- 동적할당을 한다 이는 배열이다.
- 실제 배열처럼 사용할수 있다. 애초에 배열도 모배열 혹은 상수포인터이므로 사용에 지장없다.
- 배열의 모든 원소를 출력한다.
- 동적할당된 메모리를 해제한다.
● 결과 & 스크린샷