1:经典的指针习题,求打印结果
int main() {
char *c[] = { "GULILAZHA", "LIYUCHUN", "LIUSHISHI", "ANJILA" };
char **cp[] = { c + 3, c + 2, c + 1, c };
char ***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
结果执行是
LIUSHISHI
ILAZHA
ILA
IYUCHUN
首先画一下变量在内存中的位置
内存分布
++cpp,后cpp三级指针指向cp二级指针数组第一个也就是c+2的位置, *++cpp相当三级指针cpp取值得到二级指针c + 2 , c+2 相当一级指针数组c指向第二个, **++cpp, 相当再取值得到一级指针,也就是c+2当前所指向的值就是LIUSHISHI的地址,打印就是LIUSHISHI
--++cpp+3 同上道理, ++cpp三级指针再++指向二级指针数组第二个也就是c+1位置,取值得到二级指针c+1, --*++cpp后得到二级指针c, --++cpp相当再取值,得到一级指针c的首地址值也就是GULILAZHA的地址, --++cpp+3, 相当一级指针再右加三位打印就是ILAZHA
*cpp[-2] + 3 同上,cpp已经指向了第二个, cpp[-2],相当CPP指针回退2个步长后取值(三级指针指向的位置仍然没变),也就是二级指针c+3指向c指针数组第三个位置, *cpp[-2] 相当再取值得到一级指针也就是ANJILA, *cpp[-2] + 3再加3打印就是ILA
cpp[-1][-1] + 1 同上 cpp[-1]得到二级指针 c+2, 指向c指针数组第2个位置, cpp[-1][-1] , 相当取指向c指针数组第1个位置,得到一级指针LIYUCHUN的地址, cpp[-1][-1] + 1 , 加1打印相当就是IYUCHUN
2:实现一个简单的集合
typedef void Node;
typedef struct MyArrayList {
int capacity;
int length;
int **nodes;//item指针数组(int* nodes[])
}MyArrayList;
MyArrayList* createList(int capacity);
int length(MyArrayList *list);
int add(MyArrayList *list, Node *node);
int addPosition(MyArrayList *list, Node *node, int position);
Node* get(MyArrayList *list, int position);
int remove(MyArrayList *list, int position);
int destory(MyArrayList *list);
MyArrayList* createList(int capacity) {
MyArrayList *temp = (MyArrayList*) malloc(sizeof(MyArrayList));
if (temp != NULL){
temp->length = 0;
temp->capacity = capacity;
temp->nodes = (int**)malloc(sizeof(int*)* capacity);
}
return temp;
}
int length(MyArrayList *list) {
if (list != NULL) {
return list->length;
}
return -1;
}
int add(MyArrayList *list, Node *node) {
if (list == NULL || node == NULL) {
return -2;
}
return addPosition(list, node, list->length);
}
int addPosition(MyArrayList *list, Node *node, int position) {
if (list == NULL || node == NULL || position >= list->capacity || position < 0) {
return -2;
}
if (list->length >= list->capacity) {
printf("length=%d > capacity=%d", list->length, list->capacity);
return -1;
}
for (int i = list->length - 1; i >= position; i--) {
list->nodes[i + 1] = list->nodes[i];
}
list->length++;
list->nodes[position] = (int *)node;
return 1;
}
Node* get(MyArrayList *list, int position) {
if (list == NULL) {
return NULL;
}
if (position >= list->length) {
printf("position %d outofbounds list length%d", position, list->length);
return NULL;
}
return list->nodes[position];
}
int remove(MyArrayList *list, int position) {
if (list == NULL || position < 0) {
return -2;
}
if (position >= list->length) {
printf("position %d outofbounds list length%d", position, list->length);
return -1;
}
for (int i = position; i < list->length - 1; ++i) {
list->nodes[i] = list->nodes[i + 1];
}
list->nodes[list->length - 1] = NULL;
list->length--;
return 1;
}
int destory(MyArrayList *list) {
if (list == NULL) {
return -2;
}
free(list->nodes);
free(list);
return 1;
}
int main() {
MyArrayList *list = createList(10);
Woman w1 = { 30, "安鸡拉" };
Woman w2 = { 33, "刘湿湿" };
Woman w3 = { 35, "滴力喇叭" };
Woman w4 = { 19, "咕力拉扎" };
Woman w5 = { 29, "李欲春" };
add(list, &w1);
add(list, &w2);
add(list, &w3);
addPosition(list, &w4, 1);
add(list, &w5);
return 0;
}
功能简单只是练习题而已,学过的东西偶尔拿出来练练,就不会忘记了
网友评论