# 003 DS&A-C 섹션 2의 포인터

소개


너 말고는 할 말이 없어.👋,
현수막에 있는 이 사람이 누군지 알고 싶다면 알고리즘 개념의 발명자인 Khwarizmi다.
반드시 따라주십시오. 왜냐하면 저는 미래에 더욱 고급스러운 시리즈를 시작할 것입니다.

문자 배열 및 포인터


사용할 수 있습니다.
char a[] = "omar";
char *p  = "omar";
오마르의 기억 속 모습은 이렇다
0
일.
이.
삼.
사.
o
m
하나
r
\0
\0은 문자열의 끝에 빈 문자를 나타냅니다.
*(p+3)<=>p[3]<=>a[3]ap 사이의 주요 차이점은 p가 내부의 값을 바꿀 수 없다는 것이다.이것은 그들 사이의 주요 차이점이다.문자열 상수이기 때문에 접근할 수 있지만 변경할 수 없습니다.
/* strcpy : copy t to s */
void strcpy(char *s , char *t){
    while(*s++ = *t++);
}
이 줄은 신기하다. 한 줄만 있으면 그룹을 복사할 수 있다. 이렇게 하면 모든 내용을 t에서 s로 복사하고, null 문자에 도달하면 이렇게 s='\0', 전체 표현식은null 또는 0이며, 동시에 중단된다.

예제 1


//what does the following fragment of c-program print
char c[] = "coding";
char *p = c;
printf("%s" , p+p[2]-p[0]);
//output will be : oding
p[3]-p[1]="d"-"c"=ASCII중dc=100-99=1의 차이로 인해 p+1원소가 된다
0
일.
이.
삼.
사.
오.
육.
c
o
d
하나,
n
g
\0

예제 2


#include <stdio.h>
int main() {
    char a[6] = "world";
    int i,j;
    for(i=0,j=5;i<j;a[i++]=a[j--]);
    printf("%s\n" , a);
}
// output : Null String
그것은 비어 있다. 왜냐하면 수조는 이렇기 때문이다
0
일.
이.
삼.
사.
오.
w
o
r
l
d
\0
따라서 수조 a[0]=a[5]가 되면 문자열은
0
일.
이.
삼.
사.
오.
\0
o
r
l
d
\0
프로그램이 a를 인쇄하고 있고 0에 직면했을 때 문자를 인쇄하는 것을 알고 있기 때문에 나는 여기에 멈출 수 있다.그래서 바로 멈추기 때문에 빈 문자열로 출력됩니다.

포인터 그룹과 다차원 그룹


char *name[] = {"omar" , "khatib" , "omarkhatib"};
이것은 문자를 가리키는 바늘 그룹이라는 것을 의미한다.

가령name의 시작 주소가 100이라고 가정하면,'omar'는 200,'khatib'는 300,'omarkhatib'는 400이다
name+1은 내가 102 밖에 서 있는 것과 같다. 이것은 "khatib"를 가리키는 칸이고, * (name+1) 는 내가 이 칸에 서 있는 것과 같다. 이 칸은 단지 하나의 값에 불과하다.
printf("%s" , *(name+1)); //output : khatib
이제 다른 코드의 평화를 봅시다.
printf("%s" , *name+1); // output : mar
우리가 이 결과를 얻은 것은 * 대통령이 + 보다 높기 때문에 첫 번째 칸을 가리킬 것이다.그리고 +1 알파벳으로 이동m
printf("%s" , (*(name+2)+7)); //output : tib
이름[2]에서 여덟 번째 요소에 접근할 수 있습니다(0부터 시작하기 때문에 인덱스는 7).
printf("%c" , name[2][7]); //output : t
이런 실현 방식과 수조 실현의 관건적인 차이는
char[3][11] = {"omar" , "khatib" , "omarkhatib"}
0
일.
이.
삼.
사.
오.
육.
칠.
팔.


0
o
m
하나
r
\0
일.
k
h
하나
t
하나,
b
\0
이.
o
m
하나
r
k
h
하나
t
하나,
b
\0
마지막 관건적인 차이점은 수조가 2D 수조의 메모리를 차지한다는 것이다. 우리의 예에서 수조에서 가장 긴 문자열은 "omarkhatib"이다
바늘은 어떤 메모리도 낭비하지 않고 더 많은 메모리를 차지하기 때문에 더욱 인기가 있다.또한 수조가 아닌 바늘을 사용하면 쉽게 접근할 수 있다.
줄마다 크기가 다를 수 있다.

다차원 그룹, 바늘과 함수


fun(int a[5]);
fun(int a[]);
fun(int *a);

int b[5];
fun(b);
이 세 가지는 효과가 있다. 왜냐하면 실제로는 하나의 바늘로 간주되기 때문에 수조의 크기를 전달하지 않아도 효과가 있다. 왜냐하면 그것은 하나의 바늘이기 때문이다.
지금 우리가 2D 그룹을 통과하면
fun(int a[5][6]);
fun(int a[][6]);
fun(int *(a)[6])

int b[5][6];
fun(b);
이 세 개는 포인터 a 처럼 읽히고 6개의 원소를 가리키는 그룹을 가리키기 때문에 유효하다.
int (*a)[6];
int *a[6];
이 두 원소는 다르다. 첫 번째 원소는 6개의 원소로 읽힌다.또 하나는 정수를 가리키는 바늘 그룹이다.

함수를 가리키는 바늘


이것은 자주 사용하는 기술이 아니며, 이런 방법을 사용할 좋은 창고도 없다.하지만 C 언어에서는 여전히 사용할 수 있습니다.그 밖에 코드를 읽기 어렵다.
int sum(int , int);
int *fp(int , int);
(의 대통령은 *보다 높기 때문에 두 번째 줄은 이렇게 읽는다. 이것은 함수로 정수를 가리키는 지침을 되돌려준다.
int(*fp)(int , int);
연산자표에서 알 수 있듯이 c 은 왼쪽에서 오른쪽으로 연결되어 있기 때문에 읽을 것입니다. *fp 은 하나의 함수를 가리키는 지침입니다. 이 함수는 정수를 매개 변수로 하고 정수를 되돌려줍니다.그래서 그것은 어떤 함수든지, 예를 들어sum를 가리킬 수 있다.
int s;
*fp = sum;
s = sum(2,5); // output : 7
s = (*fp)(2,5); // output : 7
또 다른 복잡한 일
void* (*gp)(void * , void *);
int* sum(int* , int*);
gp = (void*(void* , void*))sum;
포인터를 다른 포인터로 바꾸면 정보를 잃어버리지 않습니다. 앞에서 말한 바와 같이 메모리의 크기가 같기 때문입니다.

몇몇 복잡한 성명


a) char **argv
b) int (*daytag)[13]
c) int *daytag[13]
d) void *comp()
e) char (*comp)()
f) char (*(*f()))[])()
g) char (*(*f[3])())[5]
a)argv는 다른 바늘을 가리키는 바늘입니다.
b)daytag는 13개 원소로 구성된 그룹을 가리키는 바늘입니다.
c)daytag가 정수를 가리키는 13개 원소의 그룹
d)comp는void 포인터를 되돌려주는 함수
e)comp는 문자로 되돌아오는 함수를 가리키는 바늘
f)f는 함수로서char로 되돌아오는 함수를 가리키는 바늘 그룹의 바늘을 되돌려준다
g)f는 3개의 바늘과 5개의 문자를 되돌려주는 함수 바늘로 구성된 수조이다.

좋은 웹페이지 즐겨찾기