포인터와 배열(4.29)
8539 단어 C 언어 기초
int data[5];
int *p;
p = data;
p[i] <=> data[i] <=> *(p + i)<=> *(data + i)
주의: 바늘 변수는 수조의 첫 번째 주소를 저장한 후 수조 이름으로 사용할 수 있으며, 다른 점은 바늘 변수가 하나의 변수라는 데 있다.
값을 바꿀 수 있지만, 그룹 이름은 주소 상수이기 때문에 값을 바꿀 수 없습니다.
더 깊은 이해:
데이터[i] 액세스 그룹의 i번째 구성원, 실제적으로'수 그룹의 첫 번째 주소 + 구성원 편이'를 통해 그룹의 구성원을 찾습니다
=>*(data + i);
data , &data[0],&data
그들의 값은 같지만, 의미는 다르다
데이터는 그룹 이름입니다. 그룹의 첫 번째 주소만 표시합니다.
&data[0] 그룹 첫 번째 구성원의 주소를 표시합니다
&data는 전체 그룹의 주소를 가져옵니다. (그것을 구조 형식으로 처리합니다.)
연습:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
이 그룹의 내용을 출력합니다. 4중 형식
#include
int main()
{
int i;
int *p;
int a[10] = {1,2,3,4,5,6,7,8,9,10};
for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
{
printf("%d ",a[i]);
}
printf("
");
for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
{
printf("%d ",*(a + i));
}
printf("
");
#if 0
for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
{
printf("%d ",*a ++);// ,a , ,
}
printf("
");
#endif
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
{
printf("%d ",p[i]);
}
printf("
");
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
{
printf("%d ",*p ++);
}
printf("
");
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
{
printf("%d ",*(p + i));
}
printf("
");
return 0;
}
2 C 언어 1 레벨 포인터 변수와 문자열 상수
char *string = "hello word";
주의: "helloword"는 문자열 상수 구역에 저장되며, 바늘 변수string은 문자열의 첫 번째 주소를 저장합니다.
문자열 상수 영역의 내용은 수정할 수 없습니다.
연습:
char *string1 = "asdfgh";
char *string2 = "efghi";
char buf[1024];
string1과string2가 다른 문자를 찾아서 buf에 저장하고 마지막으로 buf의 내용을 출력합니다
for(q = string1;*q != '\0';q++)
{
for(p= string2; *p != '\0';p++)
{
if(*p == *q)
break;
}
if(*p== '\0')
//분명히 'a'는string2에 없고 buf 그룹에 존재합니다
}
#include
int main()
{
char *p,*q;
int count = 0;
char buf[1024];
char *string1 = "asdfgh";
char *string2 = "efghi";
printf("sizeof(string1) : %d
",sizeof(string1));
printf("sizeof(*string1) : %d
",sizeof(*string1));
for(p = string1; *p != '\0';p ++)
{
for(q = string2; *q != '\0';q ++)
{
if(*q == *p)
break;
}
if(*q == '\0')
{
buf[count ++] = *p;
}
}
for(p = string2; *p != '\0';p ++)
{
for(q = string1; *q != '\0';q ++)
{
if(*q == *p)
break;
}
if(*q == '\0')
{
buf[count ++] = *p;
}
}
buf[count] = '\0';
printf("buf : %s
",buf);
return 0;
}
3C 언어의 바늘 변수와 2차원 그룹
int a[3][2];
a[0][0]---a[0]: 0번째 줄의 첫 번째 주소 ----- a
a[0][1]
---------------------
a[1][0]---a[1]: 첫 번째 행의 첫 번째 주소 ------a+1
a[1][1]
---------------------
a[2][0]---a[2]: 두 번째 줄의 첫 번째 주소------a+2
a[2][1]
행 포인터(매번 + 1일 때 한 줄씩 움직이는 크기): a, a + 1, a + 2
열 지침(매번 + 1일 때 하나의 데이터 요소를 구성하는 크기): a[0], a[1], a[2]
행 포인터---(*) ---> 열 포인터
열 포인터---(더하기&)--->행 포인터
참고: 2D 배열에서만 포인터와 열 포인터를 구분합니다.
====================================================================================
연습: a[1][1] 구성원의 값을 얻으려면 어떤 문법이 있습니까?
a[1][1], *(&a[1][1]) ,
*(a[1]+1), *(a[0]+3)=>*(a[0]+1(간격의 행수)*2(행당 원소 개수)+1),
*(*(a + 1) + 1) , *(a[1] + 1)
=====================================================================================
#include
int main()
{
int i = 0;
int j = 0;
int a[3][3] = {1,2,3,4,5,6,7,8,9};
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 3;j ++)
{
printf("%d ",a[i][j]);
}
printf("
");
}
printf("--------------------------
");
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 3;j ++)
{
printf("%d ",*(a[i] + j));
}
printf("
");
}
printf("--------------------------
");
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 3;j ++)
{
printf("%d ",*(*(a + i) + j));//a[i] <=> *(a + i)
}
printf("
");
}
printf("--------------------------
");
for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
{
printf("%d ",*(*a + i));
}
printf("
");
int *p;
printf("--------------------------
");
for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
{
printf("%d ",*p ++);// *p , p = p + 1
}
printf("
");
printf("--------------------------
");
for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
{
printf("%d ",p[i]);//*(p + i)
}
printf("
");
printf("--------------------------
");
for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
{
printf("%d ",*(p + i));
}
printf("
");
return 0;
}
//잘못된 이해
int **p;
p = a;//a는 1급 포인터 변수의 주소가 아닙니다. 이것은 그룹 이름입니다. 2차원 그룹에서 포인터 형식입니다.
연습:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
2차원 그룹의 내용을 5중 형식으로 출력하다
=====================================================================================
생각: 어떻게 행 포인터 유형 변수를 정의합니까?
데이터 유형(*행 포인터 변수 이름) [행 요소의 개수];
int (*p)[3];//행 포인터 변수 p, 매번 +1, 매번 움직일 때마다 3개의 int형 데이터 크기
int *p[3];//포인터 배열
#include
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];//
p = a;
p ++;
printf("%d
",**p);// p ,*p
//* (*p)
p = a;
printf("%d
", *(p[2] + 1));
printf("%d
", *(*(p + 2) + 1));
return 0;
}
연습: 포인터 변수 저장 그룹 inta[3][4]의 첫 번째 주소 a를 어떻게 정의합니까?
int (*p)[4];
p = a;
a[i][j] <=>p[i][j] <=> *(a[i] +j) <=> *(p[i] + j) <=> *(*(a + i) + j) <=> *(*(p+i) + j)
이때 p와 a의 차이는 p는 변수로 바꿀 수 있고 a는 주소 상수로 바꿀 수 없다.
p++;//16바이트, int 데이터 4개 이동
======================================================================================
연습: 3줄 4열의 2차원 그룹에 값을 입력한 다음, 하나의 줄 바늘 변수로 2차원 그룹의 내용을 출력한다.
(최소 5 중 출력 방법)
#include
int main()
{
int j;
int i = 0;
int a[3][4];
int (*p)[4];
printf("Input : ");
for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
{
scanf("%d",a[0] + i);
//scanf("%d",*a + i);
}
p = a;
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 4;j ++)
{
printf("%d ",p[i][j]);
}
printf("
");
}
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 4;j ++)
{
printf("%d ",*(p[i] + j));
}
printf("
");
}
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 4;j ++)
{
printf("%d ",*(*(p + i) + j));
}
printf("
");
}
for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
{
printf("%d ",*(a[0] + i));
}
printf("
");
for(i = 0;i < 3;i ++)
{
for(j = 0;j < 4;j ++)
{
printf("%d ",*(*p + j));
}
p ++;
printf("
");
}
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0][0]);i ++)
{
printf("%d ",*((int *)p + i));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어는 피보나치 수열의 n위 숫자를 구한다1. 귀속적인 방법으로 주의해야 할 것은 귀속 방식을 사용하면 이해하기 쉬워 보이지만 연산량이 많다는 것이다.(큰 숫자를 입력할 때 이 방법을 권장하지 않음) 연산량은 지수식으로 증가한다. 2. 함수로 하는 방법; ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.