一、C语言指针知识点小结
1、初始化指针的时候会自动分配八个字节(任何类型的指针)。
1> 定义指针变量的时候,如int *p; 仅仅是代表该变量是指针变量,可以认为(int * )p;
2> p = &a;是正确的。
int *p = &a; 正确。表示把a的地址赋给p,是的指针p指向a.
*p = &a;这条语句是错误的,它表示的是把a的地址赋给*p所指向的变量,意味着把a的地址赋给a自己。
3> 如定义:int ages[5];
int *p;
p = ages;
现在可以有三种方式去访问ages数组:
(1)数组名[下标]: ages[1];
(2)指针变量名[下标]: p[1];
(3)*( p + 1 ); 指针变量加一,究竟加多少取决于指针的类型,如果是int类型指针,实际上该地址增加了四个字节。
2、指针与字符串。
1> 定义字符串的两种方式:
(1) 利用数组,char name[] = “ black ”;
特点:字符串里的字符可以修改,常用在经常需要修改内容的场合。
(2) 利用指针,char *name= “ black ”;
特点:该字符串其实是一个常量字符串,放在内存中的常量区,里面的字符不可以修改;
常用在字符串需要经常用到而且内容不需要修改的场合。
输出:printf("%c",*name); // b; *name指向字符串首地址。
printf("%s",name); // black; 因为%s会从该首地址开始依次输出,直到‘\0’;
2> 定义指针字符串数组;
char *name[5] = {"apple","bear","banana"};
3、指针与函数和结构体。
1> 返回指针的函数:
char *test()
{
return "rose";
}
main函数里面写 char *name = test (); 就可以用name来接受test中返回的指针。相当于 char *name = “rose”;;
2> 指向函数的指针:
如:void (*p) (); // (*p)是固定写法,代表指针变量p将来肯定是指向函数,左边的void代表指针变量p指向的函数没有返回值,右边的括号表示指针变量p指向的函数没有形式参数。
p = test; // 指针变量P指向了test函数。
接下来调用方式有三种:
(1) (*p)(); // 先利用指针间接调用函数test();
(2) p(); //也是调用test()函数;
(3)test(); //直接调用
举例:double haha( double d, char *s, int ){}
main()
{
double(*p)(double ,char *,int); // 定义指针函数
p = haha; // 指针P指向函数haha
(*p)(10.7,"jack",10); //调用函数
}
3> 指向结构体的指针:
如: struct Student
{
int age;
int no;
}
struct Student stu = {23,2};
struct Student *p ; //指针p将来指向struct Student类型数据。
p = &stu;
3种访问方式:
(1) printf("age = %d,no = %d\n", stu.age, stu.no);
(2) printf("age = %d,no = %d\n",(*p).age, (*p).no);
(3) printf("age = %d,no = %d\n",p->age, p->no);