◆指针的定义
指针:一个变量的地址。
指针变量:专门存放变量地址的变量叫指针变量。
◆为什么要有指针
①在使用传值调用的情况下使函数能修改实参。
(得到多于一个的函数返回值)
void Swap(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
②动态内存分配,方便对内存管理。
③构建复杂的数据结构。
④使程序简洁、紧凑、高效
◆声明并初始化指针
int *p;
// 声明一个 int 类型的指针 p
char *p
// 声明一个 char 类型的指针 p,当其指向一个字符串的第一个元素时,它就可以表示这个字符串。
int *arr[10]
// 声明一个指针数组,该数组有 10 个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10]
// 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p;
// 声明一个指针 p ,该指针指向一个 int 类型的指针
int (*sum)(int ,int );
//函数指针;
◆指针的几个常用用法
●访问数组
数组名代表数组首地址,要用一个指针访问数组,只需赋给该指针数组名即可。
int a[3];
for(int i=0;i<3;++i)
{
a[i]=0;
}
int *ptr=a;
for(int i=0;i<3;++i)
{
printf("%d",*(ptr+i));
}
●字符串
用指针来定义C 风格字符串。
char* str="Tom";
printf(“%s”,str);
printf(“%c”,*str);
printf(“%c”,str[0]);
char ch='a';
char* ptr=&ch;
printf("%c",*ptr);
●定义数组指针和指针数组
//数组指针
int (*ptr)[3];
int other[3];
for(int i=0;i<3;++i)
{
other[i]=0;
}
ptr=&other;
for(int i=0;i<3;++i)
{
(*ptr)[i]=0;
}
for(int i=0;i<3;++i)
{
printf(“%d ”,(*ptr)[i]);
}
//指针数组
int* ptr[2];
for(int i=0;i<2;++i)
{
ptr[i]=(int*)malloc(sizeof(int)*3);
//(往往和动态内存分配一起使用)
for(int j=0;j<3;++j)
{
ptr[i][j]=i*3+j;
}
}
for(int i=0;i<2;++i)
{
for(int j=0;j<3;++j)
{
printf(“%d ”,ptr[i][j]);
}
}
●动态内存分配
//方法一:
char* a[M];//指针的数组
int i;
for(i=0; i<M; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);
}
for(i=0; i<M; i++)
{
free(a[i]);
}
//方法二:
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);
}
for(i=0; i<m; i++)
{
free(a[i]);
}
free(a);
◆补充
①空指针:
指针指向的地址为空的指针叫空指针(NULL 指针)。
②&与*运算符
& 含义: 取变量的地址
* 含义: 取指针所指向变量的内容
③
i_pointer—指针变量,它的内容是地址量
*i_pointer—指针的目标变量,它的内容是数据
&i_pointer—指针变量占用内存的地址
④字符串与数组关系
char str[]={“Hello!”}; (√)
char str[]=“Hello!”; (√)
char str[]={‘H’,‘e’,‘l’,‘l’,‘o’,‘!’}; (√)
char *cp=“Hello”; (√)
int a[]={1,2,3,4,5}; (√)
int *p={1,2,3,4,5}; (×)
char str[10],*cp;
int a[10],*p;
str=“Hello”; (×)
cp=“Hello!”; (√)
a={1,2,3,4,5}; (×)
p={1,2,3,4,5}; (×)
⑤ 指针的数据类型
⑥比较易懂的视频讲解
小甲鱼P21-P27
https://www.bilibili.com/video/av27744141?p=21