上山打老虎 发表于 2021-7-30 18:19:39

c语言_Day27_07_28

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);
      }
      printf("\n");
    }return 0;
}数组指针:指向数组的指针,保存整个数组的地址
int main()
{
char arr;
char (*pa) = &arr;
return 0;
}数组名和数组的地址的区别:
两值在未处理的情况下一样,但若进行加减运算,则数组名步长为数组元素的大小,数组地址的步长为整个数组的大小
int main()
{
int arr = { 0 };
int(p) = &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[], int row, int col)
{
for (int i = 0; i < row; i++)
{

      for (int j = 0; j &lt; col; j++)
      {
            printf("%d ", arr);
      }
      printf("\n");
    }}
void Print2(int(p), int row, int col)
{for (int i = 0; i < 3; i++)
{

      for (int k = 0; k &lt; col; k++)
      {
            printf("%d ", (*(p + i)));
      }
      printf("\n");
    }}
int main()
{int arr = { {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 = { 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);
    }return 0;
}理解:索引操作相当于对指针解引用
arr == (arr + i) == (p + i) == p
总结:
int arr // 10个元素的整形数组
int parr   // 10个元素的整形指针数组
int (parr) // 指向10个元素的整型数组的指针
int (*parr)// 10个元素的数组,每个元素为具有5个元素的整形数组指针
文档来源:51CTO技术博客https://blog.51cto.com/u_15285915/3215417
页: [1]
查看完整版本: c语言_Day27_07_28