본문 바로가기

c&c++

(30)
포인터 기초 - 1바이트 메모리 공간을 단위로 하나의 주소 값이 할당된다 - 주소 값은 1씩 증가한다 - C언어에서는 시작번지만을 가지고 위치를 표현한다 - &연산자 변수의 주소 값을 얻을 때 사용 피연산자는 반드시 변수이며 상수는 피연산자가 될 수 없다 예) int a; int * pnum; pnum = &a; - 포인터 또한 변수이므로 어떠한 값을 가진다 - 이 값 또한 메모리에 할당되며 32비트 O.S에서는 4바이트, 62비트 O.S에서는 8바이트 크기를 가진다 하지만 결론적으로 포인터 변수가 가지고 있는 어떠한 값을 알 필요는 없다 - *연산자 포인터 개념에서의 *연산자는 곱셈 연산자가 아니다 메모리에 적혀있는 정보 자체를 의미한다 - 포인터 변수가 포인터 변수를 가리킬 때, 전자는 결국 후자가 가리키는 변수..
배열기반의 문자열/문자 표현 문자(char)를 ' ' 작은따옴표로 묶어야 한다는 것은 변수로 잡을 때의 이야기이다. 문자는 딱 한 글자를 말한다. 'a'라든지 'u'라든지 이런 거 진짜 딱 한 글자를 말한다. 두 글자 이상이 줄 지어 들어가면 이건 문자열이 된다. 말그대로 '문자'들을 나'열'한 거다. 이러한 경우에는 " " 큰따옴표로 묶어준다. 마찬가지로 변수로 잡을 때의 이야기이다. 이걸 함수에 사용할 때와 혼동해서는 안 된다. 예를 들면 printf 함수의 첫 번째 인자는 때려죽여도 " " 이거 안에 넣는다. 그러니까 자꾸 혼동하지 말고 딱 정리해야함. - 따옴표의 구별은 변수 선언 시에만 - 함수에서의 구별은 서식문자와 함수 호출에 필요한 인자에 따라 사용한다
문자 / 문자열 문자 문자열 character string %c %s 'a' "hello"
[도전! 프로그래밍 1] 문제7번 윤성우의 열혈 C프로그래밍 p.250 도전7 프로그램 사용자로부터 숫자n을 입력 받는다. 그리고 다음 공식이 성립하는 k의 최댓값을 계산하여 출력하는 프로그램을 작성해보자. 2^k =< n 실행의 예 상수 n 입력: 256 공식을 만족하는 k의 최댓값은 8 코드를 이렇게 짜놨더니 이런 결과가 나왔다 정말이지 화가 잔뜩 났다. 0.000000 일단 문법적 오류는 없으니 숫자쪽을 들쑤셔야 한다는 생각이 들었는데, 계속 바꿔봐도 0.000000만 찍혀서 화가 더 났었다. 그런데 순간 이런 게 보였다. pow(double_X , double_Y) pow(double_X , double_Y) 그래서 바꿔보았다. 이렇게 수정하니까 된다 뭔가 숫자가 좀 어설프지만 답은 맞게 나온다 자료형은 진짜 처음부터 계~속 사람..
재귀함수의 개념 재귀함수란 함수 내에서 자기 자신을 다시 호출하는 함수를 의미한다. 재귀함수를 실행하는 중간에 자기 자신을 호출하게 되면, 자기 자신의 복사본을 만들어서 그 복사본을 실행하게 된다. 이 원리를 통해 완료되지 않은 함수를 다시 호출한다는 것이 가능해진다. 그런데 이렇게 계속 자기 자신을 호출하여 복사본을 깔게 되면 탈출은 어떻게 하는지가 문제가 된다. #include void Recursive(int num) { if(num
static 선언을 추가한 지역변수 (+register변수) 지역변수에 static선언을 추가하면 static변수가 된다. 지역변수 지역변수의 static 선언 선언된 함수 내에서만 접근이 가능하다 해당 함수가 반환하면 메모리에서 소멸된다 딱 1회 초기화되고 프로그램 종료 시까지 메모리에 존재한다 #include void SimpleFunc(void) { static int num1 = 0; // 딱 1회 초기화, 프로그램 종료 시까지 메모리에 존재. -> 저장된 값이 남아 다음 호출 시에, 미리 저장된 값에 계속하여 연산된다. -> 사실은 여기 존재하는 것이 아니라 전역변수로서 존재하는데, 접근 범위를 SimpleFunc함수 내로 제한하기 위해 static을 붙여 여기에 써 놓은 것이다 int num2 = 0; // 얘는 함수가 반환 값을 넘겨주면 메모리에서 사..
전역변수 vs. 지역변수 해당 함수(지역) 내에서는 지역변수로의 접근이 이뤄진다 #include int Add(int val); int num = 1; //전역변수 선언 int main(void) { int num = 5; printf("add num: %d \n", Add(3)); //여기서는 함수Add를 호출하여 함수 결과를 return하기 때문에 전역변수 1이 쓰이는 것도 아니고, main함수에서 다시 정의한 5가 쓰이는 것도 아니다. Add함수 내의 연산 결과가 return될 뿐이다. printf("main num: %d \n", num+9); return 0; } int Add(int val) { int num = 9; //특정 함수 내의 지역변수 선언 num += val; //val은 뭔데?: add함수 호출을 위해 ..
break는 '반복문'을 탈출한다 #include int main(void) { int sum = 0; int num = 0; while(1) { sum+=num; if(sum>5000) break; break는 if문(조건문)을 탈출하는 것이 아니라 while문(반복문)을 탈출한다 num++; } printf("sum:%d\n", sum); printf("num:%d\n", num); return 0; } 정리: break문은 반복문 안에서 사용되며 반복문을 탈출한다