评论

收藏

[C++] c语言_Day27_07_28

编程语言 编程语言 发布于:2021-07-30 18:19 | 阅读数:316 | 评论:0

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 &lt; 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 &lt; 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 &lt; 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 == (arr + i) == (p + i) == p
总结
int arr[10] // 10个元素的整形数组
int parr[10]   // 10个元素的整形指针数组
int (parr)[10] // 指向10个元素的整型数组的指针
int (*parr[10])[5]  // 10个元素的数组,每个元素为具有5个元素的整形数组指针
关注下面的标签,发现更多相似文章