1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2.指针的大小是固定的4/8个字节(32位平台/64位平台)。
3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
4.指针的运算。
一、关于两个数组和指针是否相等的问题;
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
int main()
{
//初始化变量值;
//初始化指针;
const char* p1 = "abcdef";
const char* p2 = "abcdef";
//初始化数组;
char arr1[] = "abcdef";
char arr2[] = "abcdef";
//判断比较指针是否相等结果结果;
if (p1 == p2)
{
//打印结果;
printf("p1 == p2\n");
}
else
{
//打印结果;
printf("p1 != p2\n");
}
//结果为:p1 == p2;
//原因:因为*p1和*p2在存储时存储的是字符串首字母的地址,p1和p2的首字母都是a,a的地址是一样的;
//所以说p1 == p2;
//判断数组是否相等结果;
if (arr1 == arr2)
{
//打印结果;
printf("arr1 == arr2\n");
}
else
{
//打印结果;
printf("arr1 != arr2\n");
}
//结果为: arr1 != arr2;
//原因:因为arr1和arr2属于两个不同的数组,会在内存中开辟不同的空间;
//所以这两个字符串数组即使内容一样,但是也不会相等;
return 0;
}
二、指针数组;
指针数组是数组,是用来存放指针的数组;
int arr[10] //整型数组;
char arr[5] //字符数组;
int* arr[10] //存放整型指针的数组;
char* arr[5] //存放字符指针的数组;
三、用一维数组实现二维数组;
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
int main()
{
//初始化变量值;
int arr1[] = { 1, 2, 3, 4, 5 };
int arr2[] = { 2, 3, 4, 5, 6 };
int arr3[] = { 3, 4, 5, 6, 7 };
//初始化指针变量值;
int* parr[] = { arr1, arr2, arr3 };
//打印数组;
int i = 0;
int j = 0;
//循环打印;
for (i = 0; i < 3; i++)
{
//内层循环;
for (j = 0; j < 5; j++)
{
//打印结果;
// printf("%d", *(parr[i] + j));
//*(p + i) ---> p[i]
printf("%d", parr[i][j]);
}
//每个数组循环完成后换行;
printf("\n");
}
return 0;
}
四、数组指针;
数组名通常表示的都是数组首元素的地址
但是有2个例外:
1.s1zeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小单位是字节
2.&数组名,这里的数组名表示的依然是整个数组,所以&数组名取出的是整个数组的地址