Поки що моє заниження вказівки на недійсність полягає в наступному.
Коли змінна вказівника оголошується за допомогою ключового слова void - вона стає змінною вказівника загального призначення. Адреса будь-якої змінної будь-якого типу даних (char, int, float і т.д.) може бути присвоєна змінної недійсної вказівки.
main()
{
int *p;
void *vp;
vp=p;
}
Оскільки інший покажчик типу даних може бути призначений недійсним покажчиком, тому я використовував його у функції absolut_value (код показаний нижче). Зробити загальну функцію.
Я спробував написати простий код C, який приймає цілий чи float як аргумент і намагається зробити його + ve, якщо є негативним. Я написав наступний код,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
Але я отримував помилку, тому я зрозумів, що моє розуміння з недійсним покажчиком не є правильним :(. Отже, зараз я рухатимусь до збору балів, чому так.
Те, що мені потрібно зрозуміти більше в недійсних покажчиках, - це те.
Нам потрібно набрати змінну пустоти вказівника, щоб відкинути її. Це пояснюється тим, що вказівник недійсності не має з ним пов'язаного типу даних. Немає способу компілятор знати (чи здогадуватися?), На який тип даних вказує недійсний покажчик. Отже, щоб взяти дані, на які вказує недійсний покажчик, ми набрали їх правильним типом даних, що зберігаються всередині пустових покажчиків.
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Анульований покажчик може бути дуже корисним, якщо програміст не впевнений у типі даних, введених кінцевим користувачем. У такому випадку програміст може використовувати недійсний покажчик, щоб вказати на місце невідомого типу даних. Програма може бути налаштована таким чином, щоб попросити користувача повідомити тип даних, а тип кастингу може бути виконаний відповідно до інформації, що вводиться користувачем. Фрагмент коду наведено нижче.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
Ще один важливий момент, про який слід пам’ятати про покажчики недійсності, - це те, що арифметику вказівника не можна виконувати в недійсному покажчику.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Тож тепер я зрозумів, у чому моя помилка. Я те саме виправляю.
Список літератури:
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Новий код, як показано нижче.
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
Дякую,