c语言_Day27_07_28
1、指针深入
指针:
- 一种变量,用来存放地址
- 指针大小固定,4个字节(32位)或8个字节(64位)
- 指针具有类型:决定了指针+-整数的步长,以及解引用的权限
- 指针可以进行运算
1、字符指针
用法:
- 存放字符变量的地址
- 存放字符数组(字符串)
注:字符数组声明字符串和指针声明字符串的区别
char arr1[] = "abc";
char arr2[] = "abc";
char* p1 = "abc";
char *p2 = "abc";
printf("%p\n", arr1);
printf("%p\n", arr2);
printf("%p\n", p1);
printf("%p\n", p2);
arr1和arr2声明字符串存储于不同的数组空间中,p1和p2声明字符串为常量,仅存储一份地址
2、指针数组与数组指针
指针数组:存放指针元素的数组
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 5,4,3,2,1 };
int arr3[] = { 1,3,5,7,9 };
int* parr[] = { arr1, arr2, arr3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
数组指针:指向数组的指针,保存整个数组的地址
int main()
{
char* arr[5];
char* (*pa)[5] = &arr;
return 0;
}
数组名和数组的地址的区别:
两值在未处理的情况下一样,但若进行加减运算,则数组名步长为数组元素的大小,数组地址的步长为整个数组的大小
int main()
{
int arr[10] = { 0 };
int(*p)[10] = &arr;
printf("%p\n", arr);
printf("%p\n", p);
printf("%p\n", arr + 1);
printf("%p\n", p + 1);
return 0;
}
例:
void Print1(int arr[][5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void Print2(int(*p)[5], int row, int col)
{
for (int i = 0; i < 3; i++)
{
for (int k = 0; k < col; k++)
{
printf("%d ", (*(p + i))[k]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5}, {1,3,5,7,9},{2,4,6,8,10} };
Print2(arr, 3, 5);
return 0;
}
索引和解引用
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = arr;
for (int i = 0; i < 10; i++)
{
printf("%d ", *(arr + i));
printf("%d ", p[i]);
}
return 0;
}
理解:索引操作相当于对指针解引用
arr[i] == *(arr + i) == *(p + i) == p[i]
总结:
int arr[10] // 10个元素的整形数组
int *parr[10] // 10个元素的整形指针数组
int (*parr)[10] // 指向10个元素的整型数组的指针
int (*parr[10])[5] // 10个元素的数组,每个元素为具有5个元素的整形数组指针