longSir

流水不争先,争的是滔滔不绝

导航

C指针

基本思想:未分配指针当【typedef变量】看。已经分配指针当数组用。
数组当指针看,指针当变量看,语句用数组写。
  • 释放部分的优化,利用数组升维
#define SAFE_FREE(p) do{free(p);p=NULL;}while(0)
#define
safeFree(p) saferFree((void**)&(p)) void saferFree(void **pp) {//void *pp[1]; if (pp != NULL && pp[0] != NULL) { free(pp[0]);pp[0] = NULL; } }
  • 指针与数组的结合

 

    int *arr[3];// typedef int *type;type arr[3];int arr[3][?=1];
    for (int i = 0; i < 3; i++) {
        *(arr + i) = (int*) malloc(sizeof(int));//i love 5->3 arr[i]=(int*);int arr[3][1];
        **(arr + i) = i;//arr[i][0]=i;i love 6->4 *arr[i]=i;
        printf("%p\t%d\n", arr[i], *arr[i]);
    }
  • 数组大小的获取
printf("size of vector :%I64u\n", sizeof(vector) / sizeof(int));
  • 指针的传入与修改
void allocateArray(int **arr, int size, int value) {
    *arr = (int*) malloc(size * sizeof(int));
    if (*arr != NULL) {//int arr[1][size];=>int p[size];
        for (int i = 0; i < size; i++) {
            *(*arr + i) = value;//arr[0][i],p[i]=value;
        }
    }
    return;
}
  • 指针与函数
/////////////////////////////////////////////
int (*fptr1)(int);
int square(int num) {
    return num * num;
}
/////////////////////////////////////////////
typedef int (*funcptr)(int);
int add(int num1, int num2) {
    return num1 + num2;
}
int subtract(int num1, int num2) {
    return num1 - num2;
}
typedef int (*fptrOperation)(int, int);
int compute(fptrOperation operation, int num1, int num2) {
    return operation(num1, num2);
}
fptrOperation select(char opcode) {
    switch (opcode) {
    case '+':
        return add;
    case '-':
        return subtract;
    }
    return NULL;
}
int evaluate(char opcode, int num1, int num2) {
    fptrOperation operation = select(opcode);
    return operation(num1, num2);
}
typedef int (*operation)(int, int);
operation operations[128] = { NULL };
//int (*operation[128])(int,int)={NULL};
void initializeOperationArray() {
    operations['+'] = add;
    operations['-'] = subtract;
}
int evaluateArray(char opcode, int num1, int num2) {
    fptrOperation operation;
    operation = operations[(int) (opcode)];
    return operation(num1, num2);
}

    int n3 = 5;
    fptr1 = square;
    printf("%d squared is %d \n", n3, fptr1(n3));
    int n4 = 6;
    funcptr fptr2;
    fptr2 = square;
    printf("%d squared is %d \n", n4, fptr2(n4));
/////////////////////////////////////////////
    printf("%d\n", compute(add, 5, 6));
    printf("%d\n", compute(subtract, 5, 6));
    printf("%d\n", evaluate('+', 5, 6));
    printf("%d\n", evaluate('-', 5, 6));
    initializeOperationArray();
    printf("%d\n", evaluateArray('+', 5, 6));
    printf("%d\n", evaluateArray('-', 5, 6));
  • 字符串与指针
char *error = "ERROR: ";
char *errorMessage = "Not enough memory";
char *buffer = (char*) malloc(strlen(error) + strlen(errorMessage) + 1);
strcpy(buffer, error);
strcat(buffer, errorMessage);
puts(buffer);
puts(error);
puts(errorMessage);

if (strcmp(command, "Quit") == 0) {
printf("The command was Quit\n");
} else {
printf("The command was not Quit\n");
}
  • 优化过的获取字符串
char* getLine(void) {
    const size_t sizeIncrement = 10;
    // pointer/String
    char *buffer = malloc(sizeIncrement);
    // space pointer fill
    char *currentPosition = buffer;
    // safe maxLength
    size_t maximumLength = sizeIncrement;
    // in length
    size_t length = 0;
    // last char
    int character;
    if (currentPosition == NULL) {
        return NULL;
    }
    while (1) {
        character = fgetc(stdin);
        if (character == '\n') {
            break;
        }
        if (++length >= maximumLength) {
            char *newBuffer = realloc(buffer, maximumLength += sizeIncrement);

            if (newBuffer == NULL) {
                safeFree(buffer);
            }
            currentPosition = newBuffer + (currentPosition - buffer);
            buffer = newBuffer;

        }
        *currentPosition++ = character;
    }
    *currentPosition = '\0';
    return buffer;
}
  • 结构体与指针
typedef struct _person {
    char *firstName;
    char *lastName;
    char *title;
    unsigned int age;
} Person;
#define LIST_SIZE 20
Person *list[LIST_SIZE];

//     Person person;
//     person.firstName=(char*)malloc(strlen("Emily")+1);
//     strcpy(person.firstName,"Emily");
//     person.age=23;
//////////////////////////////////////
//    Person *ptrPerson;
//    ptrPerson = (Person*) malloc(sizeof(Person));
//    ptrPerson->firstName = (char*) malloc(strlen("Emily") + 1);
//    strcpy(ptrPerson->firstName, "Emily");
//    ptrPerson->age = 23;
/////////////////////
//     (*ptrPerson).firstName=(char*)malloc(strlen("Emily")+1);
//     strcpy((*ptrPerson).firstName,"Emily");
//     (*ptrPerson).age=23;
void initializePerson(Person *person, const char *fn, const char *ln,
        const char *title, unsigned int age) {
    person->firstName = (char*) malloc(strlen(fn) + 1);
    strcpy(person->firstName, fn);
    person->lastName = (char*) malloc(strlen(ln) + 1);
    strcpy(person->lastName, ln);
    person->title = (char*) malloc(strlen(title) + 1);
    strcpy(person->title, title);
    person->age = age;
    return;
}
void deallocatePerson(Person *person) {
    safeFree(person->firstName);
    safeFree(person->lastName);
    safeFree(person->title);
}
void initializeList() {
    for (int i = 0; i < LIST_SIZE; i++) {
        list[i] = NULL;
    }
}
Person* getPerson() {
    for (int i = 0; i < LIST_SIZE; i++) {
        if (list[i] != NULL) {
            Person *ptr = list[i];
            list[i] = NULL;
            return ptr;
        }
    }
    Person *person = (Person*) malloc(sizeof(Person));
    return person;

}
Person* returnPerson(Person *person) {
    for (int i = 0; i < LIST_SIZE; i++) {
        if (list[i] == NULL) {
            list[i] = person;
            return person;
        }
    }
    deallocatePerson(person);
    safeFree(person);
    return NULL;
}
void displayPerson(Person *person) {
    printf("%s,%s,%s,%d\n", person->firstName, person->lastName, person->title,
            person->age);
}
void processPerson() {
//    Person person;
    initializeList();
    Person *ptrPerson;
//    ptrPerson = (Person*) malloc(sizeof(Person));
    ptrPerson = getPerson();

//    initializePerson(&person, "Perter", "Underwood", "Manager", 36);
    initializePerson(ptrPerson, "Perter", "Underwood", "Manager", 36);
    displayPerson(ptrPerson);
    returnPerson(ptrPerson);
//    deallocatePerson(&person);
//    deallocatePerson(ptrPerson);
//    safeFree(ptrPerson);
}

 

posted on 2024-12-08 10:39  tablong  阅读(14)  评论(0)    收藏  举报