1.int *p[3] int(*p)[3] int(*p)(int)的区别
int*p[3] 是一个数组,里面存放指向整型变量的指针
int (*p)[3] 是一个指针,指向一个存储整形数据的数组
int(*p)(int)是一个指针,指向一个实参和返回值都为整型的函数
2.指针的自加
指向数组的指针自加之后,表示该指针指向数组的下一个单元,而不是单纯的把该指针指向的地址加1。如指向整型数组的指针,自加之后,其地址加4,因为一个整型数据占4个字节,指针指向的地址加4之后的高地址就是下一个数组单元的地址,举个例子
#include <stdio.h>
int main()
{
char a[15]="liumingliyi sb";
char *p=a; //数组名代表数组第一个元素a[0]的地址
printf("%c",*p);
p++;
printf("%c",*p);
return 0;
}
输出结果为
li
如果想要遍历数组的话可以这样
#include <stdio.h>
int main()
{
char a[15]="liumingliyi sb";
char *p=a;
int i;
for(i=0;i<15;i++)
{
printf("%c",*(p+i));
}
return 0;
}
结果
liumingliyi sb
3.取址运算符“ & ”和间接寻址运算符“ * ”
初始化指针变量时会用到取址运算符来获取变量的地址,如
int a;
int *p = &a;
表示 指针变量p存储了a变量的地址,p前面的“ * ”表示p是一个指针变量,去掉p,前面的 int * 就是p变量的指针类型,而 int 表示指针所指的变量类型,这是两个不同的概念
需要调用指针所指的变量时,会用到寻址运算符,如
#include <stdio.h>
int main()
{
char a[15]="liumingliyi sb";
char *p=a;
int i;
for(i=0;i<15;i++)
{
printf("%c",*(p+i));
}
return 0;
}
*(p+i)表示调用指针所指向的a[i]数组,即在这个程序中*(p+i)和a[i]是等价的
4.数组与指针
数组有着更深的含义,当你定义了一个数组时,你相当于定义了一个常量指针, 如int a[3]中,数组名 a 不光代表数组本身,也代表了一个常量指针,这个指针的类型为int *,指向a[0],由于该指针属于常量指针,因此不能用a++来改变a存储的地址
5.结构体指针
我们可以通过指针调用结构体中的每一个成员,如
#include <stdio.h>
struct inf
{
const char* name; //这里的字符型指针和字符数组的作用相同,都可以存储字符串 ,这里不用const char会报错
int age;
}meng={"meng",18};
int main()
{
struct inf *p=&meng;//定义了一个指针类型为inf*,指向变量类型为inf的指针
printf("%s,%d ",p->name,p->age);
printf("%s,%d ",(*p).name,(*p).age);
return 0;
}
我们定义了一个储存结构体变量地址的指针p,里面储存的是meng变量的地址,有两种方式来调用结构体变量的每一个成员,其中->是指向运算符,在用指向运算符时,p前面不能加寻址运算符,一定要注意!
第一次写博客很紧张,收获也很多