본문 바로가기

FALL in

[C프로그래밍] - 문자배열과 포인터 문자배열과 포인터 어떤 문자열을 저장하고 싶을때char str[100] = "G.MA's LOG"; 와 같이 문자배열을 초기화 해줄수 있다. 다른 방법으로char *ptr = "G.MA's LOG"; 도 가능하다.위와 같이 하면 메모리에 "G.MA's LOG"가 들어갈 공간을 만들고 "G.MA's LOG"를 넣어준다. 그리고 그 시작주소를 ptr에 넘겨주게된다. char str[100] = "G.MA's LOG";char *ptr = str; 위와같이도 가능하다. 여기서 str은 배열의 이름이자 배열의 시작주소(=&str[0])이다. 배열의 이름은 상수 포인터라고 하기도 하는데 그 주소값이 바뀔수 없기때문이다.즉 str++;을 실행하면 에러가 난다. 따라서 산술연산을 통해 배열의 원소에 접근하고 싶다면 .. 더보기
[C프로그래밍] - Call by Value vs. Call by Reference Call by Value(값에 의한 호출)단순히 변수의 값을 복사(copy)해서 넘겨준다. 원본값이 변경될 가능성이 없다.값을 넘겨줄때마다 고비용, 복사손실의 문제가 있다. Call by Reference(참조에 의한 호출) 변수의 주소값을 넘겨준다. 원본값을 변경할수있다.고비용, 복사손실의 문제가 없다.(변수안의 값을 하나하나 인자값으로 copy해서 넘겨주지않아도 되므로 메모리양을 줄일수있다.) 실행결과 더보기
[C프로그래밍] - 메모리 메모리 영역 - Stack 영역 : 어떤함수안에 변수가 선언되면 스택영역안의 그 함수의 영역에 변수가 저장된다. 함수마다 스택영역안에 자신의 스택영역이 있다. 하지만 한 함수에 변수가 선언될수있는 스택영역은 제한이 있다. 따라서 함수안에 변수가 일정개수 이상이면 에러가 나게 된다. 함수 안에 크기가 엄청큰 배열을 선언했다가 에러가 난 경험이 있을것이다. 그것이 이같은 경우이다. 스택영역은 프로그램 수행중에 메모리영역을 바꿀수 없다. - Heap 영역: 스택영역과 달리 변수선언개수에 제한이 없다. 동적으로 메모리를 할당할 경우 힙영역에 메모리가 할당된다. 힙 영역은 공유메모리(같이 쓰는공간)이기때문에 요청을 하고 반납을 해주어야한다. 힙영역은 프로그램 수행중에 메모리 요청이 가능하다. 동적 메모리 할당 m.. 더보기
[C프로그래밍] - 재귀호출 재귀호출 재귀호출은 말그대로 자기자신을 호출하여 순환 수행이 되는것이다. 아래 소스는 팩토리얼을 계산하는 재귀함수이다. 함수안에서 자기자신을 순환적으로 호출한다.마치 함수 구조가 '마트로시카'라는 러시아의 전통인형같다. 함수안에 함수가 있고 또 함수안에 함수가 있고 또 함수안에 함수가 있다. 재귀호출은 for문에의한 반복문보다 프로그래머가 코드를 이해하기 쉽고 간단하게 작성가능하다.하지만 함수를 계속적으로 불러야되기때문에 실행하는데 시간이 많이 걸릴수있다. 메인함수에서 fact(4)가 실행되면 함수로 들어가-> return 4 * fact(3);이 실행된다.여기서 fact(3)이 실행되고(return 4 * 3 * fact(2);)fact(2)가 실행되고 (return 4 * 3 * 2 * fact(1).. 더보기
[파이썬 Numpy] - 브로드 캐스팅 브로드 캐스팅(Broadcasting) - 브로드 캐스팅이 아닌 방법으로 행렬 연산하기1>>> import numpy as np>>> x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])>>> v = np.array([1,0,1])>>> y = np.empty_like(x) # x의 모양(4,3)과 같은 행렬을 만들어준다.>>> for i in range(4):... y[i,:] = x[i,:] + v... >>> print y[[ 2 2 4] [ 5 5 7] [ 8 8 10] [11 11 13]] x행렬과 v행렬초기화했을때 구조이다. for문에서 y에 값을 넣는 방식이다. - 브로드 캐스팅이 아닌 방법으로 행렬 연산하기2>>> vv = np.tile(v,(4,1)).. 더보기
[파이썬 Numpy] - 배열 수학 배열 수학(Array math) >>> import numpy as np >>> x = np.array([[1,2],[3,4]], dtype = np.float64) >>> y = np.array([[5,6],[7,8]], dtype = np.float64) # 덧셈 연산>>> print x + y [[ 6. 8.] [ 10. 12.]] >>> print np.add(x,y) [[ 6. 8.] [ 10. 12.]] # 뺄셈연산>>> print x - y[[-4. -4.] [-4. -4.]] >>> print np.subtract(x,y)[[-4. -4.] [-4. -4.]] # 곱셈 연산>>> print x * y[[ 5. 12.] [ 21. 32.]] >>> print np.multiply(x,y)[[.. 더보기
[파이썬 Numpy] - 데이터 타입 데이터타입(Datatypes) >>> import numpy as np >>> x = np.array([1,2])>>> print x.dtype # x의 데이터타입을 출력한다.int64 >>> x = np.array([1.0,2.0])>>> print x.dtypefloat64 >>> x = np.array([1,2],dtype = np.int64) # 특정 데이터타입으로 지정한다.>>> print x.dtypeint64 더보기
[파이썬 Numpy] - 배열 인덱싱 배열 인덱싱(Array indexing) >>> import numpy as np >>> a = np.array([[1,2,3,4,],[5,6,7,8],[9,10,11,12]])>>> print a[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] >>> b = a[:2,1:4] # 0부터 2앞행까지 (0~1행), 1부터 4앞열까지 (1~3열) 잘라서 b배열에 넣는다. >>> print b[[2 3 4] [6 7 8]] >>> print a[0,1]2 >>> b[0,0] = 100 >>> print a[0,1] # b의 [0,0]를 바꾸었는데 원본(a)도 같이 바뀌었다. 100b[0,0]은 a[0,1]와 같은 데이터 조각이다. 따라서 하나를바꾸면 다른 하나도 바뀐다. >>> import .. 더보기
[파이썬 Numpy] - 배열 배열(Arrays) 리스트는 서로다른 타입을 요소로 가질수있다. numpy의 array는 다른 타입섞을수 없다.array는 인덱스를 튜플로 보여준다.(a,b) (as ->numpy.~ 안하고 np.~가능하도록)>>> import numpy as np >>> gma = np.array([1,2,3,4]) # 1차원 배열이 생성된다. >>> print type(gma) >>> print gma[0],gma[1],gma[2],gma[3] # 배열의 인덱스 접근이 가능하다.1 2 3 4 >>> gma[1] = 0 # 배열요소의 변경이 가능하다.>>> print gma[1 0 3 4]>>> >>> gma2 = np.array([[1,2,3],[4,5,6]]) # 2차원 배열이 생성된다.>>> print gma2... 더보기
[C프로그래밍] - 포인터 포인터 개념 / 선언과 초기화 포인터(포인터 변수)는 변수의 주소값을 저장할수 있다. 예를 들어, int a =10; 정수형 변수 a를 선언하고 10으로 초기화 했다.변수a의 값은 메모리공간 어딘가에 저장되어진다. 변수의 값은 모두 메모리공간 어딘가에 저장되어지는데 이 변수값에 접근하고 싶다면 이 변수가 어디 저장되어있는지 주소값을 알아야 한다. &a는 a의 값이 저장되어있는 메모리주소를 의미한다. 즉 &a는 a의 주소값이다. 그리고 변수의 주소값을 저장하는 변수를 포인터 변수라고 한다. &a(a의 주소값)을 저장하기위한 자료형은 포인터인 것이다. int* ptr = &a; 이와 같이 정수형 포인터 변수를 선언하고 초기화 해줄수있다. ptr이라는 변수에 a의 주소값을 넣었다. 여기서 int * 는 하나의.. 더보기