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

时间:2015-01-01 15:41:47

标签: c malloc

我将感谢一个非常简单的解释为什么在下面的例子中我使用有时一个,有时两个asterix(间接运算符)将指针传递给对象。 在这两个例子中,我将内存专用于外部函数中的变量/对象,而不是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;
}

这里有一个asterix(间接运营商)。

#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;
}

2 个答案:

答案 0 :(得分:0)

**是指向指针的指针。它在这里使用是因为将它作为参数的函数需要更改指针本身,而不是它指向的指针。

答案 1 :(得分:0)

第一种情况:你传递一个指向指针的指针,因为你传递了它将被修改的指针的地址,你可以在函数内部重新指定函数,如

*w = (char*)malloc((l+1)*sizeof(char))

在这种情况下,函数返回后,main函数中的one star指针现在指向新分配的(在这种情况下是初始化的)内存。

第二种情况:您只需传递一个指针,虽然您可以修改它指向的内存内容,但如果将其指定给不同的指针,效果将是函数的本地效果。

注意:不建议将malloc的结果投射到c语言中,它是SO中最受欢迎的问题,请查阅。