C语言基础———指针,结构体指针,函数指针

指针基础

一 指针就是地址,地址就是指针.指针存储的是内存的地址.
二 指针的定义
1.&表示取址运算符,&a 可以取到 a 在内存中的地址;打印地址的占位符为(%p),printf(“%p\n”,&a);
2. 指针变量的定义
指针变量是用来存放地址的.
指针定义的格式:
类型数据  *变量名  =  初始值;
int *p = NULL;*在这里表示p 是一个指针变量,不是运算符.
printf(“%p\n”,p); 在打印指针的时候不需要使用取址运算符(&),因为指针本来就是地址.
*p 指针为空时,打印出来0x0的地址,为空.
int  a = 10;
p = &a;
printf(“%p\n”,p);
访问内存中的数据有两种方法:
1.直接访问内存中的数据.
printf(“%p\n”,a);
2. 通过指针进行访问.
*也可以作为取值运算符.* p 代表取到 p 指向内存中存储的数据  printf(“%d\n”,*p);
int a = 10,b = 20;
int *p1 = &a;
int *p2 = &b;
对指针重新赋值,意味着指针重指向,也就是说指针指向一个新的地址.
p1 = p2;p1指向 c 的首地址
printf(“*p1 = %d,* p2 = %d\n”,*p1,*p2);

int a = 15,b = 20;
int *p = &a;
int *p1 = &b;
单独的* p 表示取值,* p = 11 表示向 p 指向的内存中存入数据.
*p = 11;
printf(“%d\n”,a);

int *p3 = &a;
p3 = p1;
*p1 = 8;
printf(“a = %d,b = %d\n”,a,b);a = 11,b = 8

经典练习
int a = 6,b = 8,c = 10;
int *x = &a;
x = &c;
int *y = &b;
int *z = &c;
*z = 5;
*x = 12;
x = y;
 *y = *x + *z;
printf(“a = %d,b = %d,c = %d\n”,a,b,c);

指针中常见的问题
1.内存编号比较小的存储单元,是由系统控制的,不允许访问.
int *p = NULL;
*p = 100;   error
2.野指针,定义时没有赋初始值,操作野指针是很危险的
int *p;
*p = 100;error
3.定义指针时,*怎么写?
int *p = NULL;推荐
int* p1 = NULL;
int *p1 = NULL;
int*p3 = NULL;
4.指针变量在内存中占几个字节
与数据类型无关,在32位操作系统下,指针所占字节数是4位,在64位操作系统中,指针所占字节数是8位.
printf(“%lu\n”,sizeof(long *));
5. 修饰指针变量数据类型的作用
a. 指针变量数据类型,决定*(取值运算符),取多少个字节的数据;
定义指针的数据类型一定要和指向数据的数据类型一致,这样才能把数据完整的取出来
int *p = NULL;
int a = 268;
p = &a;
printf(“%d\n”,*p);
char *c = NULL;
c = &a;
printf(“%d\n”,*c);
b.指针类型,决定指针变量加1操作时,跳转多少个字节

int *p = NULL;
printf(“%p\n”,p); //0x0
printf(“%p\n”,p+1);//0x4
printf(“%p\n”,p+2);//0x8
printf(“%p\n,p++);//打印的结果是:0x4   但是实际结果是:0x8

p+1 和  p++或++ p 的关系
相同:取到的都是下一个字节的地址
不同:++p和 p++ 造成指针的重指向
6.指针在数组中的应用
int a[5] = {1,2,3,4,5};
数组名就是数组元素的首地址

printf(“%p\n”,a);
printf(“%p\n”,&a[0]);
printf(“%p\n”,p);

printf(“%p\n”,a+1);
printf(“%p\n”,&a[1]);
printf(“%p\n”,p+1);

printf(“%p\n”,a+2);
printf(“%p\n”,&a[2]);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值