C语言指针,可能正是你需要的

指针介绍

什么是指针:
1:指针就是地址,我们可以把每个类型的变量看成一个人,这个人他得有现在所在的位置(比如:在黑龙江哈尔滨,但是电脑中存储这个人的位置是用数字来表示的,比如0x100000),通过这个位置你就可以找到我,他是一个从零开始的,操作受限制的非负整数。

指针类型

指针的类型决定了,指针向前或向后的距离,比如,一个人1米9(long类型)和他1米6(short类型)的女朋友,他们两个同时像前走一不,距离相同吗,下面看一指针之间不同类型是怎么来走的。

#include <stdio.h>
int main()
{
	int n = 10;
	char* pc = (char*)&n;
	int* pi = &n;
	printf("%p\n", &n);
	printf("%p\n", pc);
	printf("%p\n", pc + 1);
	printf("%p\n", pi);
	printf("%p\n", pi + 1);
	return 0;
}

在这里插入图片描述
我们可以看到,char类型的指针加1,加了一个字节的位置,int类型的指针加1加了4个字节的位置。

指针的解引用

指针在解引用的过程中,指针的大小决定了,可以访问的权限大小。

#include <stdio.h>
int main()
{
	int n = 0x11223344;
	char* p = (char*)&n;
	int *pi = &n;
	*p;
	*pi;
	printf("%p\n", *p);
	printf("%p\n", *pi);
	return 0;
}

在这里插入图片描述

关于指针数组的概念

指针数组
p先与括号结合,代表p是个数组,数组里面是10在看外边是int*类型的指针,所以这个是指针数组。(注意优先级,先与大括号结合,就是数组,先与 *结合就是指针)。

int* p[10]=&a;

数组指针

int*p)[10]=&a;

函数指针

int add(int x,int y)
{
	return x+y;
}
int main()
{
	int (*p)( int, int)=&add;
}

函数指针数组

#include <stdio.h>
int add(int x, int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int main()
{
	int(*p[2])(int, int) = { add, sub };
	

举例解释


#include <stdio.h>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//16,4*4,计算a数组的大小
	printf("%d\n", sizeof(a + 0));//4/8 a+0的地址,地址32位是4,64位是8
	printf("%d\n", sizeof(*a));//4 首元素的大小
	printf("%d\n", sizeof(a + 1));//4/8 a+1也是地址
	printf("%d\n", sizeof(a[1]));//4 第二个元素的大小
	printf("%d\n", sizeof(&a));//4/8 取地址就不用说了
	printf("%d\n", sizeof(*&a));//16 *与&抵消,所以与sizeof(a)相同
	printf("%d\n", sizeof(&a + 1));//4/8 加一还是地址
	printf("%d\n", sizeof(&a[0]));//4/8 首元素地址
	printf("%d\n", sizeof(&a[0] + 1));//4/8 首元素加1后的地址
	return 0;
}








#include <stdio.h>
int main()
{
	char a[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(a));//6sizeof是计算数组大小,不看'\0'
	printf("%d\n", sizeof(a + 0));//4/8 a+0的地址,地址32位是4,64位是8
	printf("%d\n", sizeof(*a));//1 首元素的大小
	printf("%d\n", sizeof(a[1]));//1 第二个元素的大小
	printf("%d\n", sizeof(&a));//4/8 取地址就不用说了
	printf("%d\n", sizeof(&a + 1));//4/8 加一还是地址
	printf("%d\n", sizeof(&a[0] + 1));//4/8 首元素加1后的地址
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值