C 언어 포인터 사용 요약
전언
이 블로그는 @qyuhen 대신이 유명한 C99 학습 노트를 옮겨 싣고 그 중에서 지침 내용에 대한 소개를 총괄하였다.
프로젝트에 대량의 c프로그래밍이 필요하기 때문에 학습의 기회를 빌려 독서 노트를 기록합니다.
포인터 상수
포인터 상수란 '형식이 상수인 포인터' 를 가리키며 초기화 후 수정할 수 없으며 메모리 주소를 고정적으로 가리킨다.즉, 우리는 바늘 자체의 값을 수정할 수 없지만 바늘이 목표를 가리키는 값을 수정할 수 있다.
int x[] = {1, 2, 3, 4};
int* const p = x;
for (int i = 0; i < 4; i ++) {
int v = *(p + i);
*(p + i) = ++v;
printf("%d
", v);
// p ++; // Compile Error!
}
상수 지침
상수 포인터는 상수 데이터를 가리키는 포인터로 포인터가 가리키는 목표는 상수로 처리되어 포인터를 통해 값을 부여할 수 없다.바늘 자체는 비상량으로 다른 위치를 가리킬 수 있지만 값을 부여할 수 없다.
int x = 1, y = 2;
const int *p = &x;
// *p = 100; // Compile Error!
p = &y;
printf("%d
", *p);
// *p = 100; // Compile Error!
지침의 상량과 상량을 구별하는 방법은 매우 간단하다. const가 수식한 사람이 누구인지, 즉 *const의 왼쪽에 있는지 오른쪽에 있는지 보자.
4
4
4
바늘의 바늘
바늘 자체도 메모리 영역의 데이터 변수이기 때문에 자연히 다른 바늘로 그것을 가리킬 수도 있다.
int x = 10;
int* p = &x;
int** p2 = &p;
printf("p = %p, *p = %d
", p, *p);
printf("p2 = %p, *p2 = %x
", p2, *p2);
printf("x = %d, %d
", *p, **p2);
출력:
p=0x7fff2a16934c, *p=10
p2=0x7fff2a169350, *p2=2a16934c
x=10, 10
이를 통해 알 수 있듯이 p2는 지침p의 주소를 저장하기 때문에 지침의 지침이 있다.
배열 포인터
숫자 포인터는 '그룹을 가리키는 포인터' 를 가리킨다.여기서 주의해야 할 것은 절대로'수조 지침'과'수조 이름'을 혼동해서는 안 된다는 것이다. 그들 둘의 차이는 다음과 같다.
4
4
int x[] = {1, 2, 3, 4};
int* p1 = x; // , p
int (*p2)[] = &x; //
for (int i = 0; i < 4; i ++) {
printf("%d, %d
", *(p1 + i), (*p2)[i]);
}
p1의 형식은 int*입니다. 이것은 그룹 이름 x로 지정됩니다. 즉, 그룹의 첫 번째 원소를 가리키는 바늘 상수입니다.p2는 수조 지침으로 수조를 하나의 전체로 간주한다. 유형의 측면에서 볼 때 수조 유형과 수조 원소 유형은 두 가지 개념이다. 따라서'p2=&x'에서 x는 수조 자체를 대표하고 수조의 첫 번째 원소 주소가 아니라 &x가 취한 것은 수조 지침이다.
자신의 이해:
4
4
포인터 배열
요소 유형이 포인터인 배열을 포인터 배열이라고 합니다.
int x[] = {1, 2, 3, 4};
int* ps[] = {x, x + 1, x + 2, x + 3}; //
for (int i = 0; i < 4; i ++) {
printf("%d
", *(ps[i]));
}
기본값은 그룹의 첫 번째 원소를 가리키는 바늘 상수입니다. 그러면 x+n은 자동으로 후속 원소의 바늘을 가져옵니다.
바늘 수조는 보통 엇갈린 수조 (수조라고도 불리는 수조) 를 처리하는데, 가장 흔히 볼 수 있는 것은 문자열 수조이다.
void test(const char** x, int len)
{
for (int i = 0; i < len; i ++) {
printf("test : %d = %s
", i, *(x + i));
}
}
int main(void)
{
char* a = "aaa";
char* b = "bbb";
char* ss[] = {a, b};
for (int i = 0; i < 2; i ++) {
printf("%d = %s
", i, ss[i]);
}
test(ss, 2);
return 0;
}
함수 포인터
기본적으로 함수 이름은 이 함수를 가리키는 바늘 상수입니다.
void inc(int* x)
{
*x += 1;
}
int main(void)
{
void (*f)(int *) = inc; // inc f
int i = 100;
f(&i);
printf("%d
", i);
return 0;
}
함수 바늘의 설명이 보기 싫다면 typedef로 다시 쓸 수 있습니다.참고:
4
4
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.