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