Я просматриваю код примера, в котором используется API, чтобы понять, как правильно использовать API. Я натолкнулся на какой-то код, который я сбила с толку. Ниже приведены соответствующие куски кода:последовательный перевод указателя в C
typedef struct myStruct_id{
randomStruct1 var1;
void *var2;
unsigned char *var3;
randomStruct2 var4;
int var5;
}myStruct_name;
//Function Prototype
void randomFunction(const randomStruct1 *in1, const randomStruct2 *in2, void *handle);
//Global Variables
//assuming data1-5 are of the correct types corresponding to randomStruct1, void, etc.
myStruct_name myStruct_var = {data1, data2, data3, data4, data5};
void *handle = (void*)myStruct_var;
void main(){
myStruct_name *local_var = (myStruct_name *)handle;
//Other code here
local_var.var2 = randomFunction(&local_var.var1, &local_var.var4, &(local_var));
}
Я понимаю, что переменная ручка является
нулевого
общего указателя, указывающая на переменную myStruct_var (который был приведением типа как
нуля
родового указатель). В основной функции переменная local_var является указателем на struct myStruct_name, указывая на значение дескриптора указателя (которое вводится типа как указатель на тип myStruct_name), которое указывает на переменную myStruct_var. Далее функция randomFunction принимает в качестве входного указателя только для var1, указателя только на var2 и указателя на переменную local_var.
Моя путаница заключается в следующем: функция randomFunction требует в качестве входных указателей, указывающих на структуры и
нулевой
общий указатель а. Если local_var уже является указателем, зачем нужен адресный оператор (&)? Не является ли значение local_var уже адресом? Или мое понимание того, что происходит с local_var, неверно?
Кроме того, есть ли причина, по которой конечный вход в randomFunction заключен в скобки? То есть, почему это & (local_var), а не только & local_var? Скобки делают что-то?
Спасибо за чтение и любые ответы!
EDIT: Спасибо за ответы, указывающие, что я не имею в виду нулевой указатель. Я имею в виду void «тип данных» здесь как общий.
Добро пожаловать в переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http: // stackoverflow.com/help/ask), что и как вы можете задать здесь. –
Я думаю, вы хотите прочитать концепцию * нулевого указателя * - Ваше использование этого звучит путано. – tofro
_null pointer_ по определению указывает нигде. Просто объявляемый 'void *' не квалифицирует указатель как нулевой указатель. Сказал, что, зачем вообще игнорировать проверку типов? Не используйте 'void *' или casts без истинной необходимости. – Olaf