指针:
1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。大小与类型无关!!!
3. 指针是有类型的,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
字符指针
多种定义方式:
int main()
{
char ch = 'w';
char *pc = &ch; //字符指针存放了字符变量的地址
*pc = 'w';
char* pstr = "hello bit.";//这里其实是把一个字符串中 首地址 放到pstr指针变量里
return 0;
}
指针数组
指针数组是一个存放指针的数组。
int* arr1[10]; //定义了一个整形指针的数组
char *arr2[4]; //定义一级字符指针的数组
char **arr3[5];//二级字符指针的数组
数组指针
整形指针: int * pint;能够指向整形数据的指针。
浮点型指针: float * pf;能够指向浮点型数 据的指针。
那数组指针应该是:能够指向数组的指针。
int *p1[10]; //指针数组,本质是数组,存放的是int*指针
int (*p2)[10]; //数组指针.本质是指针,它指向的是一个大小为10个整型的数组
&数组名VS数组名的区别
#include <stdio.h>
int main()
{
int arr[10] = {0};
printf("%p\n", arr);
printf("%p\n", &arr); // &arr 表示的是数组的地址,而不是数组首元素的地址。
printf("arr+1 = %p\n", arr+1);
printf("&arr+1= %p\n", &arr+1)
return 0;
}
由下图的结果可以看到,&arr+1之后,地址实际增加了40,它是整个int数组的大小。所以&arr表示的是数组的地址。
练习题目
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//这是一个特殊,它输出的是整个数组的长度4*4=16,而不是数组的首地址的长度4
printf("%d\n", sizeof(a + 0));//因为有了+0,所以这里已经是把a当做了数组的首地址,那么不论它加上多少,都是指向一个int类型的元素,所以是4个字节的长度
printf("%d\n", sizeof(*a));//对数组首地址解引用后,是第一个元素1,长度是int的长度4
printf("%d\n", sizeof(a + 1));//同sizeof(a + 0)
printf("%d\n", sizeof(a[1]));//同sizeof(a + 0)
printf("%d\n", sizeof(&a));//数组指针,指针是4字节的
printf("%d\n", sizeof(*&a));//指针解引用,是数组,16字节
printf("%d\n", sizeof(&a + 1));//指针+1,和指针依然是同类型的
printf("%d\n", sizeof(&a[0]));//第一个元素取地址,是一个指针
printf("%d\n", sizeof(&a[0] + 1));//第一个元素取地址再+1,和指针同样的长度
system("pause");
return 0;
}