指针学习笔记

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前面不能加寻址运算符,一定要注意!

第一次写博客很紧张,收获也很多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值