2차원 배열은 문자 그대로 평면의 형태입니다. 테이블이 행과 열로 구성되는 것처럼 2차원 배열도 행과 열로 구성됩니다.
인덱스는 0에서 시작하므로 행 0, 열 0에서 시작합니다.
2D 배열은 1D 배열과 동일한 데이터 유형만 포함할 수 있습니다.
2차원 배열 선언
정수 a(3)(3); 이것은 3행 3열의 배열을 제공합니다.
데이터가 2차원 배열에 저장될 때 실제로는 평면 형태로 저장되지 않습니다.
스토리지는 연속적인 스토리지 공간입니다.
즉, 기억
| 행 0 열 0 | 행 0 열 1 | 행 0 열 2 | 행 1 열 0 | 1행 1열 | 1행 2열 | 행 2 열 0 | 행 2 열 1 | 2행 2열 |
이런 식으로 2차원 배열이 저장됩니다.
평면 3차원 배열이라고 생각하기 쉽지만 실제로는 선의 형태로 메모리에 저장됩니다.
2D 배열을 초기화하는 것은 1D 배열을 초기화하는 것과 같습니다.
정수 s(3)(3) = {
{1,2,3}, //라인 0
{2,4,6}, //라인 1
{3.6.9}, //라인 2
};
이렇게 할 수 있습니다.
물론 int s(3)(3) = {{1,2,3},{2,4,6},{3,6,9}}; 이렇게 해도 되지만 가독성이 떨어집니다.
#포함하다
네임스페이스 std 포함;
#define WIDTH 9; //const int WIDTH =9;
#정의 높이 3; // const int HEIGHT = 3;
int 테이블 (WIDTH) (HEIGHT);
int 행, 열;
for(행 = 0; 행 < 높이; 행++)
for(열 =0; 열 < WIDTH; 열++)
테이블(행)(열) = (행 + 1) * (열 + 1);
for(행 = 0; 행 < 높이; 행++){
for(열; 열 < WIDTH; 열++){
cout << 테이블(행)(열) <<",";
}
cout << endl;
}
누르다
1,2,3,4,5,6,7,8,9
2,4,6,8,10,12,14,16,18,
3,6,9,12,15,18,21,24,27,
함수와 문자열
기능이란 무엇입니까?
특정 목적을 위해 프로그래밍을 하고 있는데 문제는 주로 코드를 작성하는데 여러 군데에 함수가 필요하다는 것입니다. 이 경우 편의를 위해 함수를 함수로 구현하여 사용합니다.
두 개의 숫자를 더하는 프로그램이 있다고 가정합니다.
그런 다음 프로그램 코드를 작성하여 2와 3을 더합니다.
그러나 아래 줄에서 100과 200을 더해야 합니다.
그런 다음 위에서 작성한 프로그램 코드와 동일한 다른 코드를 작성합니다. 숫자만 다릅니다.
동일한 기능에 대해 동일한 코드를 반복해서 작성하면 코드가 불필요하게 길어지고 가독성이 떨어집니다.
그렇게 해서 내가 사용하려는 부분인 함수를 메인 함수에서 빼서 독립적으로 함수로 만든다.
물론 이 함수는 c, cpp, python, java와 같은 기본적인 기능을 가지고 있습니다.
그러나 직접 만들 수 있는 기능도 있습니다.
이것은 사용자 정의 함수, 즉 사용자 정의 함수(함수)입니다.
솔직히 저는 기능이라는 단어를 별로 좋아하지 않습니다. 배는 배일 때 배이고 숫자는 셀 수 있습니다.
난 당신이 무슨 뜻인지 모르겠어요. 영어와 같은 기능! 그렇게 부를 수 없어…
설명하자면 앞서 입력한 숫자만 다르다고 했는데 이때 입력한 숫자를 인자 또는 매개변수라고 합니다.
이러한 인수는 main에서 사용자 정의 함수로 전달됩니다.
함수 선언
함수 데이터 유형 함수 이름(인수, 인수, 인수,….){
문장
반환 함수 값(반환 값)}
함수의 데이터 타입은 모든 함수를 실행한 결과의 데이터 타입을 따릅니다.
예를 들어 int 유형의 숫자를 계산하고 결과가 char 유형인 경우 함수의 데이터 유형은 char입니다.
결과 값을 반환 값이라고 합니다. 이것은 일반적으로 return을 사용하여 표시됩니다.
반환 값이나 인수가 없을 수 있으며 이 경우에는 void(없음)가 사용됩니다.
함수 유형은 어떤 방식으로든 구성할 수 있지만 몇 가지 제한 사항이 있습니다. c, cpp에서 이미 사용되는 예약어(키워드라고도 함)는 함수 이름으로 사용할 수 없으며 일부 특수 문자도 사용할 수 없습니다.
예약어는 다음과 같이 프로그래밍 언어에서 기본적으로 정의된 단어입니다. B. if, string, int 및 switch를 키워드라고 합니다.
즉, 함수 이름으로 if를 사용할 수 없으며 문자열을 사용할 수 없습니다.
함수 호출
먼저 함수는 main을 통해 정의되어야 합니다.
프로그램의 시작점은 반드시 메인이기 때문에 컴퓨터는 메인의 끝까지 코드를 읽고 함수를 만나면 해당 함수를 호출한다.
main 위에 함수를 정의하는 것은 함수가 main 아래에 정의되어 있으면 컴퓨터가 멍청해서 함수를 찾지 않기 때문입니다. 컴퓨터가 함수를 호출할 수 있도록 main에서 정의해야 합니다.
함수가 호출되면 함수 내 명령어(코드)가 계속해서 실행되고 반환 값이 메인 함수로 전달됩니다.
예를 들어
정수 메인() {
문장;
문장;
문장;
n = 최대(2.3);
문장;
문장;
m = 최대(100,200);
문장;
문장;
0을 반환합니다.
}
여기서 프로그램이 문장을 읽는 동안 n = max(2,3);이라는 함수가 있는 문장을 만납니다. 그런 다음 기본 기능 위에서 사용자 정의 기능을 찾으십시오.
정수 최대(정수 x, 정수 와이){
만약 (x>y)
x를 반환합니다.
다른
y를 반환합니다.
}
기본 기능 위에는 최대 사용자 지정 기능이 있었습니다. 그런 다음 n = max(2,3); 2와 3(인수, 매개변수)은 위치 int x, int y로 전달됩니다. 물론 이 시점에서 전달되는 데이터 유형은 int 유형과 일치해야 합니다. char x, char y가 있는데 max(2,3)을 넘기면 에러가 난다.
그런 다음 2와 3을 취하여 함수 내에서 명령문을 실행합니다. 2>3은 false이므로 else문을 실행하고 결과값(함수값)으로 y를 리턴한다. 반환된 값은 main 함수의 n에 저장됩니다.
n = 최대(2.3); -> n = 3 이렇게 됩니다.
그런 다음 문을 실행하는 동안 m = max(100,200); 를 만나면 100과 200이 위에서 정의한 기본 사용자 정의 함수로 전달되고 반환 값은 다시 m에 저장됩니다.
메인 함수의 값을 복사하여 사용자 정의 함수에 직접 전달하는 방식을 값에 의한 호출(call by value)이라고 합니다.
기능적 프로토타입
앞서 컴퓨터가 멍청해서 메인 함수 아래에서 사용자 정의 함수를 찾을 수 없다고 말했지만 해결책이 있습니다.
위의 main은 main함수 위에 있는 함수의 필수 정보를 간결하게 요약한 것입니다.
이 요약 정보를 기능 프로토타입이라고 합니다.
그러면 컴퓨터는 실제 함수 본문이 main 아래에 있더라도 인식할 수 있습니다.
예를 들어 위에서 소개한 max 함수를 함수 프로토타입으로 작성하면,
정수 최대(정수 x, 정수 와이);
메인에 이렇게 쓸 수 있습니다.
int max(intx, int y);
정수 메인() {
}
정수 최대(정수 x, 정수 와이){
다시 어쩌구 ;}
그렇게 쓰면 컴퓨터가 이해합니다.
프로그램에서 여러 함수를 사용할 때 이러한 함수 프로토타입을 적어 놓으면 다른 프로그래머가 “아, 이런 함수가 쓰이구나”라고 보기 쉽고 가독성도 높아집니다.
함수를 호출할 때 인수 전달
지금까지 배운 함수는 모두 call-by-value였습니다.
그러나 값별 호출 방법을 사용하면 원하는 결과를 얻지 못할 수 있습니다.
이 경우 참조에 의한 호출을 사용하십시오.
값에 의한 호출과 참조에 의한 호출의 차이점은 다음과 같습니다.
한 가지만 있습니다. 값을 직접 전달하거나 값이 있는 위치를 알려주십시오…
차이점은 무엇입니까
카드를 집에 두고 왔습니다. 그래서 엄마한테 전화해서 “엄마 카드 가져와”라고 했더니 엄마가 집에 있는 카드를 복사해서 2장 만들어서 다시 만든 카드를 아이에게 주는게 값어치가 붙는다.
엄마는 “엄마, 나 지금 친구 만나러 가는 중이야. 그녀가 어디 있는지 말해 줄게. 당신은 그들을 직접 찾을 수 있습니다. 카드는 집 서랍 1번에 있습니다.”
참조에 의한 호출입니다.
즉, call by value는 main의 값을 직접 복사하여 함수에 전달하고, call by reference는 main에서 함수로 값을 직접 전달하는 것이 아니라 값이 있는 메모리 주소(위치)를 알려줍니다. 함수는 메모리 주소로 이동하여 값을 아껴서 사용합니다.
swap() 함수 만들기
swap(a, b)는 a와 b의 값을 교환합니다.
// 함수 프로토타입
int 스왑(int a, int b);
//주요 기능
정수 메인() {
정수 m = 100, n = 200;
cout << "m = "<< m << ", n = " << n << endl;
스왑(m, n);
cout << "m = "<< m << ", n = " << n << endl;
0을 반환합니다.
}
//스왑() 함수
무효 스왑(int a, int b){
정수 시간; // 임시저장공간 생성
tmp = a; // a의 값을 임시 영역에 복사
a = b; // a의 값을 b의 값으로 변경
b = tmp; // b의 값을 임시 저장소에 저장된 값으로 변경
}
이와 같이 m과 n의 값은 본질적으로 변하지 않는다. 함수에는 반환 문, 즉 반환 값이 없기 때문입니다.
또한 파이썬은 2개 이상의 값(튜플)을 반환할 수 있는 것으로 알고 있는데 C언어에서는 그게 불가능하다. 그래서 call by reference 방식이나 me… structure 방식을 사용하는 것도 있지만 여기서는 call by reference 방식을 사용하겠습니다. 저도 구조에 대해 잘 모릅니다.
참조별 호출 방식
// 함수 프로토타입
int 스왑(int* a, int* b);
//주요 기능
정수 메인() {
정수 m = 100, n = 200;
cout << "m = "<< m << ", n = " << n << endl;
교환(&m, &n);
cout << "m = "<< m << ", n = " << n << endl;
0을 반환합니다.
}
//스왑() 함수
잘못된 스왑(정수*A, 정수*B){
정수 시간; // 임시저장공간 생성
tmp = *a; // a의 값을 임시 영역에 복사
*a = *b; // a의 값을 b의 값으로 변경
*b = tmp; // b의 값을 임시 저장소에 저장된 값으로 변경
}
이처럼 *, & 기호는 생소할 수 있지만 C언어에서 포인터의 개념이다.
cpp에서는 포인터를 사용하지 않고 참조를 사용합니다…
그러나 여기서는 먼저 C 언어의 포인터에 대해 설명하겠습니다.
참조에 의해 호출될 때 main 함수에서 인수를 전달할 때 값이 아닌 위치가 전달됩니다.
&는 위치를 나타내는 기호입니다. &m m이 있는 메모리 주소를 스왑 기능으로 전송합니다. 0x61fe1c는 이렇게 전달됩니다.
그런 다음 스왑 기능에서 주소 0x61fe1c로 이동하여 m 값을 찾아 변경합니다.
이때 값 대신 주소를 구하려면 int * 타입의 포인터 변수 a를 사용해야 한다.
그냥 int a 타입의 일반변수로 받으면 m의 주소를 9로 바꾸면 m의 값이 이상하게 변한다.
주소를 얻으려면 포인터 변수를 사용해야 합니다.
어쨌든 사용자 정의 함수에 주소를 인자로 전달하고 사용자 정의 함수에서 그 주소를 인자로 받아 그 주소를 직접 호출하여 값을 변경하는 것을 참조에 의한 호출(call by reference)이라고 합니다.
이 경우 return 문으로 값을 반환하지 않아도 m의 값이 변경됩니다.
cpp는 참조를 사용합니다.
정수 a = 10;
정수 &r = a;
이렇게 사용
정수 a = 10; 일반 변수를 10으로 초기화하고,
정수 &r = a; ar이 별칭임을 나타내고 &는 r이 변수 이름이 아니라 별칭임을 나타냅니다.
&는 cpp 속어로 참조라고 합니다.
이것을 “참조 r은 변수 a의 별칭입니다.”로 해석하면 다음과 같이 해석될 수 있습니다.
a = 20이면 r은 자동으로 a의 닉네임을 20으로 변경합니다.
즉, a와 r은 인칭 관계에서 동일인입니다. 말 그대로 이름만 다릅니다.
예를 들어, 아무개라는 사람이 있습니다.
그의 별명은 Fallen Power Warrior입니다.
아무개가 옷을 입을 때. 그런 다음 타락한 파워 워리어도 옷을 입었습니다.
말 그대로 닉네임 개념이다.
프로그램 예
int max(int& a, int& b); // 함수 프로토타입
정수 메인() {
정수 m = 2, n = 9;
최대(m,n);
0을 반환합니다.
}
무효 최대(int& a, int& b){
정수 시간;
tmp = a;
a = b;
b = tmp;
}
이렇게 사용하세요.즉, 값을 인수로 제공하고 별칭으로 가져옵니다.
포인터와 차이점은 무엇입니까
C언어의 포인터는 엄마가 지도의 위치를 알려주는 지도,
cpp 언어 참조는 집에 있는 카드를 찾기 위한 것입니다.
정리하다
값에 의한 호출: main 값을 복사하여 함수에 전달하면 함수가 복사 값에 액세스합니다.
call by reference: main에 값이 있는 주소를 전달하면 함수는 해당 주소로 이동하여 값에 액세스합니다.
call by reference cpp: main의 원래 소스는 함수에서 직접 호출되지만 원래 소스에는 다른 이름(별칭, 참조)이 지정됩니다.
c에는 참조 개념이 없지만 cpp에는 참조 개념이 있습니다.
따라서 c에서 int& a; 틀린 표현이긴 하지만
cpp에서 int& a; 및 int &a;.
이때 주소를 지정할 때 &a와 구별해야 한다. 데이터 유형이 앞에 있으면 주소 &이고, 데이터 유형이 없으면 참조 &입니다.
중복 기능
c 언어는 중복 함수를 허용하지 않지만 cpp는 중복 함수, 즉 같은 이름의 함수를 사용할 수 있도록 합니다.
그러나 중복 함수의 인수의 데이터 유형이 다르거나, 인수의 데이터 유형이 동일한 경우 인수의 개수가 다른 한계가 있습니다.
함수의 데이터 유형은 중요하지 않습니다.
예를 들어 정수를 제곱하는 함수
정수 제곱(정수 i) {
반환 i*i;
}
해냈다고 생각하자
그런 다음 실수를 제곱하는 함수
이중 사각형 (double i) {
반환 i*i;
}
made 이때 c에서는 이름이 사각형이 같아서 에러가 나지만 cpp에서는 이름은 같지만 파라미터의 데이터 타입이 같기 때문에 두 함수를 모두 사용할 수 있다.
기본 인수
말 그대로 기본 인수입니다. 함수의 인수에 값을 저장하면 main에서 함수가 호출되고 인수가 전달되지 않으면 저장된 값으로 함수가 처리됩니다.
예)
스왑(정수 a = 3, 정수 b = 2){
정수 시간;
tmp = a;
a = b;
b = tmp;
cout << a <<", " << b << endl;
}
정수 메인() {
정수 = 1;
정수 n = 4;
스왑(4);
0을 반환합니다.
}
이렇게 하면 스왑 함수는 총 두 개의 인수를 취해야 하지만 하나만 취해야 합니다. 그러면 4가 수신되었으므로 swap()에서 a=4이고 b=2이므로 4와 2가 반환됩니다.
인라인 함수
인라인 함수에 들어가기 전에 함수를 호출하는 과정을 거쳐야 합니다.
main에서 함수를 호출하면 해당 함수의 인수 개수에 따라 해당 함수에 대한 메모리(스택)가 생성됩니다. 그러나 저장 공간(스택)을 생성하는 데 시간이 오래 걸릴수록 더 오래 걸립니다.
인라인 함수의 개념이 등장했습니다.
인라인 함수는 복사 붙여넣기 개념으로 함수를 구성하는 코드를 컴파일할 때 메인에서 호출되는 부분에 복사 붙여넣기를 하면 시간이 절약된다.
예를 들어
인라인 int sum(int x, int y){
리턴(x+y);
}
정수 메인() {
정수 n;
n = 합계(2,3); // 컴파일 과정에서 sum(2,3) 대신 n = 2+3이 입력된다.
cout << "연산 결과 = " << n << endl;
0을 반환합니다.
}
![[5주차] TCP/IP(흐름제어, [5주차] TCP/IP(흐름제어,](https://weve.icover.kr/wp-content/plugins/contextual-related-posts/default.png)
