C | C语言学习(五)指针和数组、指针运算、指针数组、多级指针

一、指针和数组

	//数组名是数组的首地址
	int arr[] = {1,2,3,4,5,6,7,8,9};
	//p是指向数组的指针
	int* p = arr;
	//修改数组元素arr[1]的值
	arr[1] = 20;
	p[1] = 20;//正确
	//输出arr[0]的值
	printf("%d\n", arr[0]);//1
	printf("%d\n", *arr);//1
	printf("%d\n", *(arr+0));//1
	printf("%d\n", *p);//1
	printf("%d\n", p[0]);//1
	//输出arr[1]的值
	printf("%d\n", arr[1]);//20
	printf("%d\n", *(arr+1));//20
	printf("%d\n", *(p+1));//20
	printf("%d\n", p[1]);//20
  1. 数组名是数组的首地址;
  2. 获取某个元素的值:*(地址+偏移量)
  3. 指针变量p与数组arr的区别:
    1. 指针变量p是变量;数组名arr是常量。
    2. sizeof(p)的值是4;sizeof(arr)的值是元素个数*sizeof(数组类型)。
  4. 【指针变量+1】 等同于 【指针变量当前值,即内存地址,+ sizeof(数据类型)】。
  5. 数组作为函数参数会退化为指针,丢失数组的精度。
    int GetSumRight(int arr[], int length)
    {
    	printf("%d\n", length);//10
    	int sum = 0;
    	for (size_t i = 0; i < length; i++)
    	{
    		sum += arr[i];
    	}
    	printf("%d\n", sum);//55
    }
    
    int GetSumError(int arr[])
    {
    	int length = sizeof(arr) / sizeof(arr[0]);
    	printf("%d\n", length);//1
    
    	int sum = 0;
    	for (size_t i = 0; i < length; i++)
    	{
    		sum += arr[i];
    	}
    	printf("%d\n", sum);//1
    }
    int main()
    {
    	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    	GetSumRight(arr, sizeof(arr) / sizeof(arr[0]));
    	GetSumError(arr);
    }

二、指针运算

  1. 两个指针相减等到的结果是两个指针的偏移量(步长)。
  2. 所有的指针类型相减,结果都是 int 类型。
  3. 指针的加减运算和指针的类型有关:
    1. 如果指针类型是int*,+1 的结果是增加一个 int 的大小(4个字节)
    2. 如果指针类型是char*,+1 的结果是增加一个 char 大小(1个字节)
  4. 指针操作数组时下标允许是负数。
	int arr[] = {1,2,3,4,5,6,7,8,9};
	int* p = arr;
	p = &arr[3];
	printf("%d\n", p[0]);//即arr[3],4
	printf("%d\n", p[-3]);//即*(p-3),即arr[0],1

三、指针数组

  1. 指针数组里面元素存储的是指针;
  2. 指针数组是一个特殊的二维数组模型,指针数组对应于二级指针。
  3. 二级指针就是指向一个一级指针变量地址的指针。
	int a[] = { 1,2,3 };
	int b[] = { 4,5,6 };
	int* p[] = { a,b };
	printf("%d\n", **p);//1
	printf("%d\n", *p[0]);//1
	printf("%d\n", p[0][0]);//1

	printf("%d\n", *(*p + 1));//2
	printf("%d\n", *(p[0] + 1));//2
	printf("%d\n", p[0][1]);//2

	printf("%d\n", *(*p + 2));//3
	printf("%d\n", *(p[0] + 2));//3
	printf("%d\n", p[0][2]);//3

	printf("%d\n", *(*(p + 1)));//4
	printf("%d\n", *(p[1]));//4
	printf("%d\n", p[1][0]);//4

	printf("%d\n", *(*(p + 1) + 1));//5
	printf("%d\n", *(p[1] + 1));//5
	printf("%d\n", p[1][1]);//5

	printf("%d\n", *(*(p + 1) + 2));//6
	printf("%d\n", *(p[1] + 2));//6
	printf("%d\n", p[1][2]);//6

	for (size_t i = 0; i < 2; i++)
	{
		for (size_t j = 0; j < 3; j++)
		{
			printf("%d ", *(*(p + i) + j));
			printf("%d ", *(p[i] + j));
			printf("%d\n", p[i][j]);
		}
	}

四、多级指针

	int a = 10;
	int* p = &a;
	int** pp = &p;
	int*** ppp = &pp;

	//*ppp等同于pp,等同于&p;
	//**ppp等同于*pp,等同于p,等同于&a;
	//***ppp等同于**pp,等同于*p,等同于a;

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/108190830