#include <stdio.h>
int main(void) {
int arr1[2][2] = {
{1,2}, {3,4} };
int arr2[3][2] = { {
1,2 },{ 3,4 }, {5,6 } };
int arr3[4][2] = { {
1,2 },{ 3,4 }, {5,6 }, {7,8} };
int (*ptr) [2];
int i;
ptr = arr1;
printf("**show 2,2 arr1 ** \n");
for (i = 0; i < 2;
i++) {
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
ptr = arr2;
printf("**show 3,2 arr1 ** \n");
for (i = 0; i < 3;
i++) {
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
ptr = arr3;
printf("**show 4,2 arr1 ** \n");
for (i = 0; i < 4; i++)
{
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
return 0;
}
질문 : int (*ptr) [2]; 여기서 괄호를 뺴면 오류가 나는 이유가 뭐죠??
질문 : 포인터 배열 vs 배열
포인터… 먼차이지?
#include <stdio.h>
int main(void) {
int num1 = 10, num2 =
20, num3 = 30, num4 = 40;
int arr2d[2][4] = {
1,2,3,4,5,6,7,8 };
int i, j;
int *whoA[4] = { &num1, &num2,
&num3,&num4 }; // 포인터 배열
int(*whoB)[4] = arr2d; //배열 포인터
printf("%d %d %d \n", *whoA[0], *whoA[1], *whoA[2], *whoA[3]);
// *을 떄고 실행하면 주소값이 프린트됨 >> whoA[]배열에는 (주소)가 있는거니까 *을 사용하여 포인터를 사용하여 한단계 뒤에있는 num을 가리켜주어야함
for (i = 0; i < 2;
i++) {
for (j = 0; j < 4;
j++) {
printf("%d ", whoB[i][j]);
//여기서 *을쓸떄
오류가 남 whoB 왜???
}
printf("\n");
}
return 0;
}
WhoA : 포인터 배열 >> int형 포인터 변수로 이뤄진 int형 포인터 배열
whoB : 배열 포인터 >> 가로길이가 4 인 int형 2차언 배열을
가리키는 포인터 변수
답변 추가
(네이버 카페..쓰기전에 구글링먼저하자 재발)
· 연산자 우선순위 때문입니다. [] 가 *보다 우선순위가 높아서 괄호없이 int *ptr[2] 를 하게되면 int형 포인터 2개가 묶인 배열이 생성되는거죠. 길이는 2칸이고 각 칸의 자료형은 int형 포인터인 배열이요. 이것이 포인터배열이구요.
반면 int (*ptr)[2] 를 해주게되면, 2칸짜리 int로 된 배열을 가리키는 포인터 하나가 생성되는겁니다. 이것이 배열포인터입니다.
반면 int (*ptr)[2] 를 해주게되면, 2칸짜리 int로 된 배열을 가리키는 포인터 하나가 생성되는겁니다. 이것이 배열포인터입니다.
·
· *ptr[ ]이면
{&n1,&n2}의 형식으로 포인터변수의 묶음으로 보면되고
(*ptr)[ ]이면 앞서 선언되었을 2차원배열을 가리키는 포인터입니다. ([ ]속은 가로의 길이)
*ptr[2] => *ptr이 두개 => 가로 길이가 가변적인 배열 두개를 달수있다!
(*ptr)[2] => *ptr이 가질 수 있는 배열이 두칸! => 가로길이가 2칸인 고정된 배열을 가질 수 있다!
본문에서 arr1, arr2, arr3은 가로길이가 2칸짜리죵! 이런것들을 가질 수 있다는겁니답.(물론 다른것도 달 수는 있다.)
결론
*ptr[2] => 가로칸수가 가변적이고, 세로줄수는 2칸으로 고정됨.
(*ptr)[2] => 가로칸수가 2칸으로 고정되고, 세로줄수가 가변적임.
2017.03.11 추가내용{&n1,&n2}의 형식으로 포인터변수의 묶음으로 보면되고
(*ptr)[ ]이면 앞서 선언되었을 2차원배열을 가리키는 포인터입니다. ([ ]속은 가로의 길이)
*ptr[2] => *ptr이 두개 => 가로 길이가 가변적인 배열 두개를 달수있다!
(*ptr)[2] => *ptr이 가질 수 있는 배열이 두칸! => 가로길이가 2칸인 고정된 배열을 가질 수 있다!
본문에서 arr1, arr2, arr3은 가로길이가 2칸짜리죵! 이런것들을 가질 수 있다는겁니답.(물론 다른것도 달 수는 있다.)
결론
*ptr[2] => 가로칸수가 가변적이고, 세로줄수는 2칸으로 고정됨.
(*ptr)[2] => 가로칸수가 2칸으로 고정되고, 세로줄수가 가변적임.
#include <stdio.h>
#include <string.h>
void RemoveLine(char str_pointer[]) {
int len = strlen(str_pointer);
str_pointer[len - 1] = 0;
}
int main(void) {
char str[100];
fgets(str, sizeof(str), stdin);
printf("%d : %s \n", strlen(str), str);
RemoveLine(str);
printf("%d : %s \n", strlen(str), str);
return 0;
}
형광팬 친부분에서, &str str 둘다 됬던이유 : 배열명만 써주면 가장 첫밴째 주소를 주는것이므로 &str = str 임
또한 *str_pointer == str_pointer[]도 됨
드디어 안햇갈린다!! 오예아
댓글 없음:
댓글 쓰기