함수 선언시 int func_name(int a, int b) 대신 int func_name(int , int) 가능
//
연산 후 둘 중 하나 반환할 때
int large_number(int a, int b)
{
if(a > b)
return a;
else
return b;
}
//
지역 내에서는 지역 변수가 전역 변수보다 우선시된다.
//
static 사용법
void fct(void) // static int val = 0; <- 중요함
{
int val = 0;
val++;
printf("%d",val)
}
//
포인터란 메모리의 주소 값을 저장하기 위한 변수이다.
포인터가 변수라는 것을 강조하기 위해 '포인터 변수'라는 표현을 쓴다.
'포인터 변수'의 크기는 4바이트이다.
포인터가 가리키고자 하는 변수의 자료형에 따라서 적절한 타입의 포인터를 선언해야 한다.
(*pA)++; // a++와 같은 의미이다.
포인터에 타입이 존재하는 이유는 포인터를 이용해서 변수를 참조하는 경우 몇 바이트를 읽어 들여야 할 지 알 수 없게 된다. 포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다.
포인터는 변수이고(포인팅하는 곳을 바꿀 수 있음), 배열의 이름은 상수(프로그램이 종료될 때까지 선언한 배열의 첫 번째 요소만 가리킨다.)이다.
//
포인터에 배열 주소 대입할 때
int arr[3] = {1,2,3};
int *ptr;
ptr = arr; // 중요한 부분
printf("%d %d %d", ptr[0], ptr[1], ptr[2]);
//
포인터 연산
ptr++; // 선연산 후증가 따라서 이 상태로 printf 찍으면 처음 그 값 나오고 다음에 다시 printf 찍으면 연산된 값 나옴, 이건 다음 번지로 넘어감 (int형 4자리, char형 1자리, double형 8자리)
ptr +=3;
--ptr;
ptr2=ptr1+2;
단 곱셈, 나누기는 안됨
blog.naver.com/liberty914/220283990162
C언어 Chapter 12-3. 포인터변수와 괄호의 사용, 그들의 차이점
안녕하세요? Rex 입니다 ^_^/ 포인터변수를 쭉 보다보니, 괄호에 대한 궁금증이 생기더라구요,괄호를 사용...
blog.naver.com
ex)
num = 10;
int *ptr1 = #
(*ptr1)++ // 값에다가++
*ptr1++ // 주소에다가 ++
//
*(++pArr) // 포인터가 가리키는 곳이 완전 이동함 (주차됨)
*(pArr+1) // 포인터가 주차된 곳에서 포인터 자료형에 따라서 +1된 메모리 주소의 값을 읽음
//
열혈강의c p330
int arradder(int *pArr, int n)
{
}
=====
int arr[10] = {~~~~~~~};
int sumofadder;
sumofadder=arradder(arr, sizeof(arr) / sizeof(int))
//
int pArr[]과 int *pArr은 같다.
//
열혈강의c p406
void show_data(int (*ptr)[4], int row_data) // intptr[][4]도 가능, 단 함수의 매개변수로 선언시에만 가능
{
int i, j;
for(i = 0; i < row_data; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d ", ptr[i][j]);
printf("\n");
}
}
int arr1[2][4] = {1,2,3,4,5,6,7,8};
int arr2[3][4] = {{1},{2},{3}};
show_data(arr1,2);
show_data(arr2,3);
//
열혈강의c p408 int ptra[4] ,int (*ptra)[4]의 차이 / p319 배열 요소를 포인터를 지니는 포인터 배열
키워드: 포인터배열, 배열포인터
arr[i] == *(arr+i) // 인덱스 접근방법, 2차원에서는 주소로 접근?
//
구조체 배열 선언
struct person{
char name[20];
char phone[20];
int age;
};
=====
struct person pArray[10]; // 구조체 배열 선언
pArray[0].age = 10; strcpy(pArray[1].name, "smith") // 각 구조체 배열로 접근
ex)
for (int i = 0; i < 3; i++)
{
scanf("%s %s", pArray[i].name, pArray[i].phone);
}
//
구조체 선언과 동시에 초기화
=====
struct person pArray[3] = {
{aa,bb,cc},
{123,123,123},
{567,567,567}
};
//
구조체 생성
구조체 배열 생성
구조체 포인터 생성
구조체 포인터로 맴버 접근 후 print
구조체 포인터로 맴버 접근 후 값 변경 후에 print
#include <stdio.h>
struct _person {
char name[20];
int age;
};
void main()
{
struct _person person[3] = {
{"abc",1},
{"def",2},
{"ghi",3}
};
struct _person* P_person;
P_person = &person;
for (int i = 0; i < 3; i++)
{
printf("%s\n", P_person[i].name);
}
P_person[0].age = 5;
printf("%d", P_person[0].age);
}
//
구조체 변수의 주소 값과 구조체 변수의 첫 번째 멤버의 주소 값은 같다.
//
구조체 선언 후 함수로 구조체 넘기기 (value, reference)1
#include <stdio.h>
struct simple {
int data1;
int data2;
};
void show(struct simple ts)
{
printf("%d %d\n", ts.data1, ts.data2);
}
void swap(struct simple *ps)
{
int temp;
temp = ps->data1;
ps->data1 = ps->data2;
ps->data2 = temp;
}
void main()
{
struct simple s = { 1,2 };
show(s);
swap(&s);
show(s);
}
구조체 선언 후 함수로 구조체 넘기기 (value, reference)2 (포인터 변수 선언)
#include <stdio.h>
struct simple {
int data1;
int data2;
};
void show(struct simple ts)
{
printf("%d %d\n", ts.data1, ts.data2);
}
void swap(struct simple *ps)
{
int temp;
temp = ps->data1;
ps->data1 = ps->data2;
ps->data2 = temp;
}
void main()
{
struct simple s = { 1,2 };
struct simple* ps;
ps = &s;
show(s);
swap(ps);
show(s);
}
//
동적 메모리 할당
#include <stdio.h>
#include <stdlib.h>
void function(int i)
{
int* array = (int*)malloc(sizeof(int) * i);
int j;
if (array == NULL)
puts("fail");
for (j = 0; j < i; j++)
{
array[j] = j + 1;
}
for (j = 0; j < i; j++)
{
printf("%d ", array[j]);
}
printf("\n");
}
void main()
{
int m = 0;
fputs("배열의 크기를 입력하세요: ", stdout);
scanf_s("%d", &m);
function(m);
}
'Program language > C' 카테고리의 다른 글
C6011 경고 해결방법 (0) | 2021.05.19 |
---|---|
[C] Max(a,b) ((a>b) ? a:b) (0) | 2021.04.13 |
[C] 데이터를 구조체로 반복해서 입력받고 출력하기 (0) | 2021.04.05 |
[C] 구조체 화살표연산자 이용해서 대소 비교하기 (0) | 2021.04.05 |
[C] 구조체 화살표 연산자 이용하기 (0) | 2021.04.05 |