指针介绍
什么是指针:
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;
}