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);
}
浙公网安备 33010602011771号