포인터 선언하는 방법
type* tp
포인터로 가르킬 변수와 같은 형의 포인터를 선언해 줘야한다,
& 단항연산자로 사용되면 주소값을 반환하는 연산자이다.
int e = 1000;
int* poi = &e;
*poi = 1;
printf("%d",*poi);
정수 e를 선언하고 정수형 포인터 poi를 선언하고 그 포인터에 정수 e의 주솟값을 할당하고 포인터를 이용해서 정수 e를 참조하고 이를 통해서 정수 e의 값음 1로 전환했다.
array[i] = *(array+i)
int *poi1, *poi2;
포인터 한번에 두개 선언하려면 변수 앞에 *을 붙여주세용
int array[3] = {1, 2, 3};
double array2[3] = {1.1,2.2,3.3};
printf("%d %lf\n", *array, *array2);
(*array) += 100;
(*array2) += 100.1;
printf("%d %lf\n",array[0], array2[0]);
c언어에서 배열의 이름을 포인터로 사용이 가능해서 * 연산의 적용이 가능합니다.
int list[3] = {1,2,3};
int* ptr = list; // int* ptr = &list[0]
c언어 에서 포인터 연산을 적용하면 포인터에 더하거나 뺀 수 곱하기 자료형의 바이트타입 만큼 증가하고 감소한다.
예를 들어서 정수형 포인터인 int * ptr = 0x1000을 선언하고 ptr +1 연산을 갈기면 4만큼 증하고 예를 들어 이포인터가 실수형 double형 포인터일 경우에는 8만큼 증가하고 감소한다.
또한 포인터 연산을 실시하면 참조하던 값은 변경되지 않지만 참조하는 대상이 바뀐다 예를 들어서 ptr이 배열의 첫번째 요소를 가르키고 있다면 덧셈 연산을 통해서 주소값이 4 증가하고 이는 배열에서 다음번째 요소를 가르키는 포인터가 된다.
void deliverArrayToFunction(int* array){
}
void deliverArrayToFunction(int array[]){
}
위와 같이 포인터를 파라미터로 작성하는 방식과 배열 을 전달하는 방식 두가지가 존재하는데 두방식 모두 작동원리는 동일하다.
일반적으로 배열을 함수의 파라미터로 전달하는 방법은 아래의 방법이 더 많이 사용된다.
void swap(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
이것조차 떠오르지 않는 내 인생이 레전드
c언어에서 string 을 입력받을 때 scanf(”%S”, STRING) 으로 작성하고 & 연산자를 사용하지 않는 이유는 문자열은 자체로 주소값을 반환하는 포인터 이기 때문이다.
int num;
const int* pointer = #
*pointer = 20;
위와 같이 int 밖에 const를 작성하면 포인터 연산을 통해서 포인터가 가르키는 값의 변경을 제한하는 것으로 간주된다.
*pointer = 20;
따라서 다음의 코드에 컴파일 오루가 발생한다.
하지만 pointer 자체가 상수로 전언된것은 아니기 때문에
pointer = &다른 변수
쌉가능이다.
int* const pointer = #
pointer = &다른주소값;
pointer* = 다른값
위와 같이 const 선언을 int 안에 갈기면 포인터가 가르키는 값은 변경가능해서 오류가 발생하지 않지만 이는
pointer* = 다른값
오류가 발생하지 않는다.
pointer= 다른값
오류가 발생한다. pointer가 상수로 선언되었기 때문이다. 포인터 그 자체를 상수로 선언하는 문장이다 이렇게 선언하는 것이 문장을 보호하는 측면서는 훨씬 효휼적인 방법이다.
const int* const pointer = #
위와 같이 선언하면 포인터 내부에 담겨있는 주소의 변경도 불가능하고 또한 포인터가 가르키는 값의 변경또한 불가능한 상태가 된다.
void getInteger(int *a, int *b, int *c) {
printf("삼각형의 세변의 길이를 입력하세요\n");
scanf("%d %d %d", a, b, c);
}
진은아 함수를 이렇게 만들면 함수에 ㅏ파라미터로 전달되는 거는 변수의 주소 이기 때문에 주소값을 scanf()함수를 사용할 때 주소 연산자를 사용하지 않아도 괜찮아
c언어에서 배열의 길이를 계산하는방법은 list 의 전체 메모리 사이즈에 자료형의 사이즈로 나누는 방법이 잇다 근데 이건 c라이언에서 는 실행이제대로 안되는거 봐서는뭔가 잘목된거 같고 비주얼 스튜디오에서만 작동이 잘되는 거 같다.
#include<stdio.h>
void multibyself(int *a){
*a = *a * *a;
}
int multibpleduplcate(int a){
return a*a;
}
void swap(int *a , int* b, int*c){
int x;
x = *a;
*a = *b;
*b = *c;
*c = x;
}
int main(){
int a = 1, b = 2, c = 3;
printf("a : %d, b: %d, c:%d\n",a,b,c);
swap(&a,&b,&c);
printf("a : %d, b: %d, c:%d\n",a,b,c);
printf("%d\n",multibpleduplcate(a));
multibyself(&a);
multibyself(&b);
multibyself(&c);
printf("a : %d, b: %d, c:%d\n",a,b,c);
}
콜 바이 벨류의 함수는 원래 의 값이 전달되는 것이 아닌고 값이 전달되어서 전달도기 대문에 함수의 실행이실제 변수의 값을 변경하지 못한다 하지만 콜바이 레포런스의 함수는 직접적으로 변수의 주소가 전달되기때문에 값의 ㅂ변화가 당연하게 발생하는 함수이다.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void printArray(int array[], int size) {
printf("[");
for (int i = 0; i < size; i++) {
if (i < size - 1) {
printf("%d,", array[i]);
} else {
printf("%d", array[i]);
}
}
printf("]\n");
}
void bubbleSorting(int list[], int size) {
for (int i = size-1; i >= 0; i--) {
int changed = 0;
for (int j = 0; j < i-1; j++) {
if (list[j] > list[j + 1]) {
int tmp = list[j];
list[j] = list[j + 1];
list[j + 1] = tmp;
changed = 1;
}
}
if (changed == 0) {
break;
}
}
}
int main() {
srand((unsigned) time(NULL));
int list[20];
for (int i = 0; i < 20; i++) {
list[i] = (int) rand() % 10;
}
printArray(list, 20);
bubbleSorting(list, 20);
printArray(list, 20);
}
c언어로 구현한 버블정렬 지렸다 진자 진은아 넌 진짜로 쫀나 될넘이야
c언어로 구현한 선택정렬