매개 변수로 배열 포인터를 함수에 전달
Bint 배열 포인터를 func 기능으로 전달하고 거기서 변경해서 메인 기능의 변화를 보고 싶습니다.
#include <stdio.h>
int func(int *B[10]){
}
int main(void){
int *B[10];
func(&B);
return 0;
}
위 코드는 몇 가지 오류를 제공합니다.
In function 'main':|
warning: passing argument 1 of 'func' from incompatible pointer type [enabled by default]|
note: expected 'int **' but argument is of type 'int * (*)[10]'|
EDIT: 새 코드:
#include <stdio.h>
int func(int *B){
*B[0] = 5;
}
int main(void){
int B[10] = {NULL};
printf("b[0] = %d\n\n", B[0]);
func(B);
printf("b[0] = %d\n\n", B[0]);
return 0;
}
이제 다음과 같은 오류가 발생합니다.
||In function 'func':|
|4|error: invalid type argument of unary '*' (have 'int')|
||In function 'main':|
|9|warning: initialization makes integer from pointer without a cast [enabled by default]|
|9|warning: (near initialization for 'B[0]') [enabled by default]|
||=== Build finished: 1 errors, 2 warnings ===|
당신의 새 코드에
int func(int *B){
*B[0] = 5;
}
B에 대한 포인터입니다.int,따라서B[0]가int, 그리고 당신은 당신이 그들의 집에서int. 제거만 하면 됩니다.*,
int func(int *B){
B[0] = 5;
}
그리고 그것은 동작한다.
초기화 시
int B[10] = {NULL};
당신은 초기화를 하고 있습니다.int와 함께void*(NULL에서 유효한 변환이 있습니다.void*로.int, 이것은 효과가 있지만 변환은 구현으로 정의되어 있고 보통 프로그래머의 실수를 나타내므로 컴파일러가 경고합니다.
int B[10] = {0};
0-initial라이징을 하는 적절한 방법입니다.int[10].
아마도 당신은 이것을 하려고 했었나요?
#include <stdio.h>
int func(int * B){
/* B + OFFSET = 5 () You are pointing to the same region as B[OFFSET] */
*(B + 2) = 5;
}
int main(void) {
int B[10];
func(B);
/* Let's say you edited only 2 and you want to show it. */
printf("b[0] = %d\n\n", B[2]);
return 0;
}
배열 포인터를 실제로 전달하고 싶다면,
#include <stdio.h>
void func(int (*B)[10]){ // ptr to array of 10 ints.
(*B)[0] = 5; // note, *B[0] means *(B[0])
//B[0][0] = 5; // same, but could be misleading here; see below.
}
int main(void){
int B[10] = {0}; // not NULL, which is for pointers.
printf("b[0] = %d\n\n", B[0]);
func(&B); // &B is ptr to arry of 10 ints.
printf("b[0] = %d\n\n", B[0]);
return 0;
}
하지만 다른 답변들에서도 언급되듯이, 이렇게 하는 것은 그리 흔한 일이 아닙니다.일반적으로 포인터 대 배열은 2d 배열을 통과하고 싶을 때만 통과되며, 이때 갑자기 훨씬 더 선명해 보입니다.2D 배열은 실제로 첫 번째 행의 포인터로 전달됩니다.
void func( int B[5][10] ) // this func is actually the same as the one above!
{
B[0][0] = 5;
}
int main(void){
int Ar2D[5][10];
func(Ar2D); // same as func( &Ar2D[0] )
}
func의 파라미터는 다음과 같이 선언될 수 있습니다.int B[5][10],int B[][10],int (*B)[10], 모두 파라미터 유형과 같습니다.
부록: 함수에서 배열로의 포인터를 반환할 수 있지만 함수를 선언하는 구문이 매우 어색하므로 유형의 [10] 부분이 매개 변수 목록 뒤에 와야 합니다.
int MyArr[5][10];
int MyRow[10];
int (*select_myarr_row( int i ))[10] { // yes, really
return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}
눈의 피로를 방지하기 위해 일반적으로 다음과 같이 수행합니다.
typedef int (*pa10int)[10];
pa10int select_myarr_row( int i ) {
return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}
사용.*(B)대신에*B[0].여기서,*(B+i)암시하는B[i]그리고.*(B)암시하는B[0[] 즉*(B+0)=*(B)=B[0].
#include <stdio.h>
int func(int *B){
*B = 5;
// if you want to modify ith index element in the array just do *(B+i)=<value>
}
int main(void){
int B[10] = {};
printf("b[0] = %d\n\n", B[0]);
func(B);
printf("b[0] = %d\n\n", B[0]);
return 0;
}
새로운 코드 할당에서 다음과 같이 해야 합니다.
B[0] = 5
func(B)에서 당신은 배열 B를 가리키는 포인터의 주소를 그냥 통과하는 것입니다.func()에서 B[i] 또는 *(B + i)로 변경할 수 있습니다.여기서 i는 배열의 인덱스입니다.
첫번째 코드에서 선언문에는 이렇게 적혀있습니다.
int *B[10]
는 B가 10개의 요소의 배열이며, 각 요소는 int를 가리키는 포인터라고 말합니다.즉, B[i]는 int 포인터이고 *B[i]는 i번째 저장된 텍스트 라인의 첫 번째 정수를 가리키는 정수입니다.
main()
{
int *arr[5];
int i=31, j=5, k=19, l=71, m;
arr[0]=&i;
arr[1]=&j;
arr[2]=&k;
arr[3]=&l;
arr[4]=&m;
for(m=0; m<=4; m++)
{
printf("%d",*(arr[m]));
}
return 0;
}
그렉고의 정말 훌륭한 예를 사용하여 배열을 포인터로 통과시키고 간단한 -1 조작을 수행하는 버블 정렬로 작동했습니다.
#include<stdio.h>
void sub_one(int (*arr)[7])
{
int i;
for(i=0;i<7;i++)
{
(*arr)[i] -= 1 ; // subtract 1 from each point
printf("%i\n", (*arr)[i]);
}
}
int main()
{
int a[]= { 180, 185, 190, 175, 200, 180, 181};
int pos, j, i;
int n=7;
int temp;
for (pos =0; pos < 7; pos ++){
printf("\nPosition=%i Value=%i", pos, a[pos]);
}
for(i=1;i<=n-1;i++){
temp=a[i];
j=i-1;
while((temp<a[j])&&(j>=0)) // while selected # less than a[j] and not j isn't 0
{
a[j+1]=a[j]; //moves element forward
j=j-1;
}
a[j+1]=temp; //insert element in proper place
}
printf("\nSorted list is as follows:\n");
for(i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
printf("\nmedian = %d\n", a[3]);
sub_one(&a);
return 0;
}
저는 포인터를 캡슐화하는 방법에 대해 읽을 필요가 있습니다. 왜냐하면 그것은 저를 불쾌하게 했기 때문입니다.
func의 인수는 이중점 변수를 허용하는 것입니다.이게 도움이 되길...
#include <stdio.h>
int func(int **B){
}
int main(void){
int *B[10];
func(B);
return 0;
}
함수 선언에 다음과 같이 입력해야 합니다.
VOID FUN(INT *a[]);
/*HERE YOU CAN TAKE ANY FUNCTION RETURN TYPE HERE I CAN TAKE VOID AS THE FUNCTION RETURN TYPE FOR THE FUNCTION FUN*/
//IN THE FUNCTION HEADER WE CAN WRITE AS FOLLOWS
void fun(int *a[])
//in the function body we can use as
a[i]=var
언급URL : https://stackoverflow.com/questions/13730786/c-pass-int-array-pointer-as-parameter-into-a-function
'programing' 카테고리의 다른 글
| DBD 설치 방법:: 딸기 펄 속의 오라클 (0) | 2023.09.28 |
|---|---|
| 비트 와이즈 연산자를 사용하여 숫자가 양수인지 음수인지 확인 (0) | 2023.09.28 |
| Galera 노드가 떨어지면 커밋에서 '잠금을 시도할 때 데드락 발견 (0) | 2023.09.28 |
| Excel VBA: 배열 변수의 변형 (0) | 2023.09.28 |
| 32비트 cmd.exe에서 64비트 파워셸을 시작하는 방법은? (0) | 2023.09.28 |