[TIL] 260919 공부기록
과제준비&c공부하기
TIL#
오늘은 배가 무척 하루종일 아파서 좀 상태가 안좋았다.. 약만 두알이나 먹었고 헤롱헤롱 했던것같다. 코어타임을 위해 csapp를 초반에 조금 훑고, 오전에 vsc lldb 설치랑 asan을 설치해서 디버깅해봤다 과제하기전에 이런식으로 디버깅하는구나 좀 알아서 내일 시작해봐야될것같다 막판에 C공부로 혼공 C 200페이지정도 봤고 밑에 몰랐던 부분을 정리해봤다
배운점#
전위연산자 ++a 먼저 6으로 증가, 6을 사용 (1증가→증가한 값 사용)
형변환 int a = 10을 형변환 하고싶다면 (double)10 처럼 괄호를 쓴다
만약 20/3으로 나누기몫만 구하는게 아니라 소수점 이하까지 값을 구하려면 실수여야되는데 res = ((double)a)/((double)b); 를 사용한다 보통 int형을 기본으로 쓰고 실수연산이필요할때 형변환을 사용
실수에서 정수로 추릴때 반올림하지않고 버림 a=(int)res
*= 는 왼쪽값에 오른쪽 값을 곱해서 다시저장한다는 뜻 res = res *30;
비트연산자
연산자 우선순위 : 단항연산자>이항연산자 > 삼항연산자 (++a는 단항연산자 *이항연산자
산술 연산자>비트 이동연산자 > 관계연산자>논리연산자 () 괄호 → 증감++,— →곱나눗셈 →덧셈뺄셈→비교연산자 →&&→|| →=(대입)
if문 규칙이 안에 두줄이상일때는 무조건 괄호를 써야된다
if(a>=0){ printf("현재 a의 값:%d\n",a); a=1;}else a=-1;if,else if, else 는 조건식1이참이면 실행문 1만 실행 하고 조건식1이 거짓이고 조건식 2가 참이면 실행문 2만 실행 모든 조건식이 거짓이면 실행문 3 실행함
if문 중첩 장점
선행조건이 있으면 불필요한 조건검사를 하지않음
switch case문: 여러개 상수중 조건에 해당하는 하나를 골라 실행하는것 switch case문(break문 포함필요)
default는 블록 안 어디에위치해도 상관없으나 보통 블록 마지막에 두어 예외상황을 처리한다 (상수를 모두 비교하고 일치하는 상수가 없을때 default로 감)
반복문
while(조건식) 실행문;
for문 ( 초기식;조건식;증감식)
do while문 do 실행문, while (조건식) 실행문을 무조건 실행하고 조건을 확인후에 다시 실행문을 실행함
do{ a=a*2;//반복할문장} while(a<10);//반복조건반환값이 없는 함수 : 함수가일을 한 뒤에 결과값을 돌려주지않음 (void)
return 10 처럼 값을 넣으면 일반적으로 void함수를 사용할수없다
재귀함수 약함
재귀문제를 볼때
① 종료 조건 ② 지금 내가 처리할 것 ③ 다음 재귀 호출
배열 선언
int ary[5]; ary 배열명 [5] 요소개수
int가 4바이트이고 5개를 연속 할당하면 20바이트가된다 배열의나누어진 조각을 배열요소라고 함
배열을 선언할때 int arr [5]는 배열요소가 5개
배열요소를 사용할때 arr[0] = 10;은 첫번째 배열요소위치
배열은 초기화 할때 {} 중괄호를 사용한다
sizeof 연산자를 활용한 배열처리 : 배열의 크기가 바뀌어도 자동으로 계산됩니다.
sizeof(배열) = 배열 전체가 차지하는 바이트 수
sizeof(배열[0]) = 배열의 원소 하나가 차지하는 바이트 수
배열에 문자를 넣을땐 여분의 공간 \0이 필요하다
문자를 상수로 하나씩 초기화 할때는 {} 중괄호 사용, 한번에 초기화 할때는 “” 을 사용한다
초기화 한 문자는 배열의 처음부터 차례대로 저장되어 문자열을 만든다 이때 남는 배열 요소에는 자동으로 0이 채워짐 char 형 배열에 저장된 0을 특별히 널문자로 부른다
char 형 배열에 저장된 문자열을 다른 char형배열에 대입하기 “strcpy(str2,str1);`
문자열 전용 입출력 함수 : gets,puts
scanf 함수는 char형 배열에 입력할수있으나 빈칸이 있는경우 빈칸전가지만 입력해서 빈칸을 포함해서 문자열을 입력할수있는 새로운 방식이 필요하다
gets 함수는 빈칸을 포함해 한줄 전체를 문자열로 입력한다 이 함수와 짝을 이루는 문자열 출력 함수 puts도 있다
문제는 배열의 크기를 검사하지않아서 긴문자열을 입력하면 배열에 벗어난 메모리 영역에 침범할수도있음
puts함수는 문자열 상수나 char형 배열의 배열명을 주면 문자열을 화면에 출력한다 printf함수의 문자열 출력기능과 같음 단, 문자열을 출력한 후에 자동으로 줄을 바꾸는 차이가 있다
널 문자가 없으면 다른프로그램이 남긴 이상한 값을 남길수있음
scanf 함수는 하나의 단어만 입력 gets는 한줄 입력 printf는 문자열 출력 puts 함수는 문자열 출력후 줄바꿈
포인터파트
메모리주소
메모리의 위치를 식별하는 주소 값은 바이트 단위로 구분된다 0부터 시작하고 바이트 단위로 1씩 증가하므로2바이트 이상의 크기를 갖는 변수는 여러개의 주소값에 걸쳐 할당된다
주소 연산자
주소는 변수가 할당된 메모리 공간의 시작주소를 의미한다 시작주소를 알면 그 위치부터 변수의 크기만큼 메모리를사용할수있다 주소연산자 &을 사용
주소는 보통16진수로 표기하고 주소를 출력할때 전용변환 문자인 %p를 사용하는것이 좋다
메모리 주소는 필요할때마다 계속 주소 연산을 수행하는 것보다 한번 구한 주소를 저장해서 사용하면 편리한데 포인터가 바로 변수의 메모리 주소를 저장하는 변수다 선언할때는 변수앞에 *을 사용한다
int main(void){
int a; int *pa;//포인터 선언
pa= &a;//포인터에 주소 대입 *pa=10;//포인터 변수 a에 10 대입
printf("포인터로 a값출력 %d\n",*pa);
return 0;}int *pa 일반 변수명 규칙에 따라 포인터 이름을 짓고 변수명 앞에 *를 붙인다
포인터가 어떤 변수의 주소를 저장한 경우 가리킨다 라고 말한다 x → y로 표현하면 x는 y를 가리킨다고 말하고 x는 포인터이며 변수 y주소를 저장하고 있다는 뜻
포인터에서 사용되는 const의미는 간접 참조해 바꿀수없다는것이다
포인터에 const 사용 이유: 문자열 상수는 값이 바뀌면 안되므로 함수의 매개변수르 통해서 값을 바꿀수없도록 매개변수로 선언된 포인터에 const 사용.
주소와 포인터의 차이
주소는 변수에 할당된 메모리 저장공간의 시작 주소 값 자체고 포인터는 그값을 저장하는 또 다른 메모리 공간이다
특정 변수의 주소값은 바뀌지않지만, 포인터는 다른 주소를 대입해 그 값을 바꿀수있다. 주소는 상수가 되고 포인터는 변수라고 생각하자
두 포인터가 같은 주소를 저장하는 일, 하나의 변수를 동시에 가리키는 일도 가능하다
주소를 주소로 바꾸는 건 불가능
포인터도 저장공간이므로 그 크기가 있다 포인터 크기는 저장할 주소의 크기에 따라 결정되는데 크기가 클수록 더 넓은 범위의 메모리를 사용할수있다.
형변환을 사용한 포인터 대입은 언제나 가능하다
포인터가 가리키는 자료형이 다른 경우 형변환 연산자를 사용하면 경고메시지 없이 대입할수있다 대입 후에 포인터를 통한 사용 문제가 없어야함
pi = (int *)pd; pi 간접 참조연산을 수행하면 변수 a의 일부를 int형 변수처럼 사용할수있음
배열명은 포인터와 다르다 배열++의 경우 배열명은 상수라 값을 바꿀수없지만 포인터는 가능하다
다중포인터
이중포인터도 변수이므로 주소연산자를 사용하면 그 주소를 구할수 있습니다 만약 이중포인터가 가리키는 자료형이 double 포인터라면 이중포인터를 가리키는 삼중 포인터는 ***ppp로 선언함
이중이상을 다중포인터라고 한다
느낀점#
오늘은 배가 아파서 약으로 버텼는데도 계속 아프다보니 공부에 집중을 못했다 ㅠㅠ 내일 일요일 외출하지않고 와서 C공부를 오전에 할수있으면 하고 오후에 과제1번을 좀 풀어볼까한다 csapp는 힘들때 한번씩 보기로.. 노트북LM을 돌려서 퀴즈를 풀고있는데 좀 쉽지않다 ㅋㅋㅋ 오답노트를 노션에 파서 정리하고있는데 도움은 되는것같기도…