c - 当一个和两个星号(间接运算符)将参数传递给 C 中的函数时

标签 c malloc

我将感谢一个非常简单的解释,为什么在下面的示例中我有时使用一个,有时使用两个星号(间接运算符)将指针传递给对象。 在这两个示例中,我将内存专用于外部函数中的变量/对象,而不是主函数中的变量/对象。是否可以更改这两个示例,以便在传递参数时使用一个/两个星号?我尝试过但没有成功。一个示例只能按原样运行,另一个示例也按原样运行。无法修改它们。 那么我可以使用两个间接运算符将指向结构的指针传递给外部函数并为该结构分配内存吗?

还有一个问题,如果函数将某些内容返回给 main,它是否会复制其参数,分配新内存并将副本返回给 main?不向变量分配新内存以使用不向 main 返回任何内容的函数(void function(...))是唯一的方法吗?

本例中的两个星号(间接运算符):

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

void funkcja(char ** w){ //adres adresu znaku
  char bufor[256];
  scanf("%s", bufor);
  int l;
  l=strlen(bufor); //pamiętać, że nie liczy 0 na końcu
  *w=(char*)malloc((l+1)*sizeof(char));
  if(*w==0) exit(1);  
  strcpy(*w,bufor); 
}


int main(){
  char * twsk[5];
  int i;
  for(i=0;i<5;i++){
    funkcja(&twsk[i]); //adres i-tego elementu tej tablicy ktorym jest wsk
  }

  for(i=0;i<5;i++){
    printf("%s\n",twsk[i]);
  } 
 return 0;
}

此处有一个星号(间接运算符)。

#include <stdio.h>
#include <stdlib.h>

typedef struct Diament{
  float **kamienie; //tablica brylantów i kolczykow
  int count;
}diamenty;

diamenty * WprowadzanieCenBrylantow(diamenty * oferta);
void ObliczCeny(diamenty * oferta);
int Informacja(diamenty * oferta);
void Pokaz(diamenty * oferta);

int main(){
    diamenty * oferta;
    oferta = WprowadzanieCenBrylantow(oferta);
    Pokaz(oferta);
    ObliczCeny(oferta);
    /*Pokaz(oferta);*/
    Informacja(oferta);
    return 0;
}

//------------------------------------------------------------------------------

diamenty * WprowadzanieCenBrylantow(diamenty * oferta){
   int count=0;
   int i;
   printf("Podaj ilosc brylantów jakie chcesz wpisać -> ");
   scanf( "%d", &count );
   oferta = malloc(sizeof(diamenty)); //alokacja pamięci na całą strukturę
   oferta->kamienie = malloc(sizeof(float*)*count); //alokacja pamięci na tablicę cen, na odpowiednią liczbę wierszy
   for(i=1;i<count+1;i++){
      oferta->kamienie[i]=malloc(sizeof(float)*(count-i+1)); //alokacja pamięci na daną tablicę dodatkowy element na cenę kamienia, na kolumny
   }
   oferta->count=count;
   printf("Podaj ceny diamentów \n");
   for(i=1;i<count+1;i++){
      printf("Diament numer %d podaj jego cenę -> ",i);
      scanf("%f", &oferta->kamienie[i][0]); //kolumna 0 zawiera ceny pojedynczych brylantów i je tu wpisuję
      printf("Wpisana cena to -> %f \n", oferta->kamienie[i][0]);
    }
   return oferta;
}


//----------------------------------------------------------------------------- 

void ObliczCeny(diamenty * oferta){
  int liczba = oferta->count;
  int i,j;
  for(i=1;i<liczba+1;i++){  //przesuwam się po numerach wszystkich kamieni
    for(j=1;j<liczba-i+1;j++){  //przesuwam się jeszcze raz po kamieniach ale tylko tyle aby dostać macierz trójkątną
        oferta->kamienie[i][j]=oferta->kamienie[i][0]+oferta->kamienie[liczba-j+1][0];
        /*printf("Kombinacja diament %d i diament %d , czyli kamienie[%d][%d] -> łączna cena wynosi %f\n", i, (oferta->count-j+1), i, j, (oferta->kamienie[i][j])); */
    }
  }
}


//***********************************************************
void Pokaz(diamenty * oferta){
   int i,j;
   int liczba=oferta->count;
   printf("\n");
   /*for(i=1;i<liczba+1;i++){
     printf("Cena wynosi -> %f \n", oferta->kamienie[i][0]);
   } */
   for (i=1;i<liczba+1;i++){
      for(j=1;j<liczba-i+1;j++){
          if(j==1){printf("Cena brylantu %d wynosi -> %f \n", i, oferta->kamienie[i][0]);}
          printf("%d %d %f \n -> ", i, liczba-j+1, oferta-> kamienie[i][liczba-j+1]);
      }
   }
}

//***********************************************************

int Informacja(diamenty * oferta){
   int kamien1, kamien2, temp;
   int liczba=oferta->count;
   char odpowiedz[256];
   do{
       printf("Podaj numery brylantów, które mają stworzyć kolczyki. \n Na początek podaj numer diamentu numer 1 -> ");
       scanf("%d",&kamien1);
       printf("Teraz podaj numer drugiego brylantu -> ");
       scanf("%d",&kamien2);
       if (kamien1>kamien2){
          temp=kamien1;
          kamien1=kamien2;
          kamien2=temp;}
       if (kamien1==kamien2) {printf("Nie można kupić dwa razy takiego samego kamienia\n"); return 0;}
       if (kamien1<=0 ||kamien2<=0) return 0;
       if(kamien1<=liczba && kamien2<=liczba)
           printf("Cena: %f\n",oferta->kamienie[kamien1][oferta->count-kamien2+1]);
       printf("Czy chcesz sprawdzić ceny innej pary kolczyków? Wpisz T albo N");
       scanf("%s", odpowiedz);
       }while((strcmp(odpowiedz,"N")!=0)&&(strcmp(odpowiedz,"n")!=0));
   return 0;
}

最佳答案

** 是一个指向指针的指针。此处使用它是因为将其作为参数的函数需要更改指针本身,而不是它所指向的内容。

关于c - 当一个和两个星号(间接运算符)将参数传递给 C 中的函数时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27732168/

相关文章:

C、全局变量的改变不保留在函数之外

iOS Swift malloc 错误

c - 用于结构的 Malloc

c - 我不知道为什么我的 C 代码总是返回 128

在 C 中创建通用链表

c - 在C中递归地添加两个由数字组成的字符串

c++ - 如何在有和没有 std::vector 的情况下正确使用 jpeg_mem_dest

c - 反转传递指针地址的链表

c - 使用链表时 malloc 中的段错误

c - 强制进入 PLT 部分