c语言指针3
int main() {int ar[] = { 1,2,3,4,5,6,7,8,9,20 };int n = sizeof(ar) / sizeof(ar[0]);int* p1 = &ar[0];int* p2 = &ar[n];printf("%d\n", p2 - p1); //元素的个数 40/4 = 10return 0;
}
输出:10
注:
1.p2+p1语法错误
2.p2-(char*)p1 二义性
int *p;
*p = 10; //野指针
野指针没有数据空间
结构体
指针指向结构体时,可以通过指向符->操作其内部成员,简洁方便
typedef struct Student {char* name;int age;float height;
}Student;int main() {Student s = { (char*)"名字",30,170.5 };printf("name = %s, age = %d, height = %f\n", s.name, s.age, s.height);printf("name = %s, age = %d, height = %f\n", (&s)->name, (&s)->age, (&s)->height);Student* ps = &s;printf("name = %s, age = %d, height = %f\n", (*ps).name, (*ps).age, (*ps).height);printf("name = %s, age = %d, height = %f\n", ps->name, ps->age, ps->height);return 0;
}
链表
#define ElemType int
typedef struct ListNode{ElemType data;struct ListNode *next;
}ListNode;typedef ListNode* List;int main(){List head;ListInit(&head);ListCreate(&head);
}
复杂指针解析
C/C++所有复杂的声明结构,都是由各种声明的嵌套构成的,理解复杂指针可以使用左右法则
左右法则--首先从未定义的标识符开始看起,然后往右看,再往左看,每当遇到圆括号,就应该调转阅读方向,一旦解析完圆括号里面的所有东西,就跳出圆括号,重复这个过程直到整个声明解析完成
复杂指针:
1.int * (* (*func) (int *)) [10];
2.int (*func)(int *, int (*)(int *));
3.int (*func[5])(int *);
4.int (*(*func)[5](int *);
5.int (*(*func)(int *)) [5];
6.(*(void(*) ())0)();
7.void(*set_new_handler(void(*f)()))();
1.int * (* (*func) (int *)) [10];
首先func是一个指针,该指针指向一个函数,函数的特征是具有一个整型指针参数和一个指针的返回值,该指针指向的是数组,数组具有十个元素,其中每个元素都是整型指针
2.int (*func)(int *, int (*)(int *));
首先func是一个指针,该指针指向一个函数,函数的特征是具有两个参数和一个返回值,其参数一个是整型指针参数,另一个是函数指针的参数,函数返回值为整型值
3.int (*func[5])(int *);
首先func是一个数组,数组具有五个元素,其中每个元素都是一个指针,该指针指向函数,函数的特征是具有一个整型指针的参数和一个整型的返回值
4.int (*(*func)[5](int *);
首先func是一个指针,该指针指向数组,数组具有五个元素,每个元素都是指针,指针指向函数,函数特征为一个整型指针参数和一个整型返回值
5.int (*(*func)(int *)) [5];
首先func是一个指针,指针指向函数,函数特征为一个整型指针参数和一个指针的返回值,其返回值指针指向的是具有五个整型数据的数组