C语言基础:理解指针基础

◆指针的定义

指针:一个变量的地址。
指针变量:专门存放变量地址的变量叫指针变量。

◆为什么要有指针

①在使用传值调用的情况下使函数能修改实参。
(得到多于一个的函数返回值)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值