C语言的指针(三)

1.数组名的理解

    (1)数组名本身就是地址(数组首元素的地址)

    eg.  arr 等价于 &arr[0]

    特例:1):sizeof(数组名),此时的数组名表示整个数组,sizeof计算的是整个数组的大小,单                     位为字节。

               2): &数组名,此时的数组名也表整个数组,取出的是整个数组的地址(在+/-整数时以整                     个数组的大小为单位)

    eg.   int arr[10]

            &arr   =   012FF774      arr   =   012FF774      &arr[0]   =   012FF774

            &arr+1=  012FF79C      arr+1=  012FF778      &arr[0]+1= 012FF778

*指针类型决定了指针+/-整数时的步长:&arr[0] --------> int*,arr--------> int*,&arr--------> int(*)[10]

  2.使用指针访问数组

    (1) arr [ i ] == *(arr + i)  这是完全等价的。

    (2)罕见的写法

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		//printf("%d ", arr[i]);
		//printf("%d ", *(arr+i));
		//printf("%d ", *(i+arr));
		printf("%d ", i[arr]);
	}
	return 0;
}
  3.一维数组传参本质

    典例 :

#include <stdio.h>
void test(int arr[10])//int* arr
{
	int sz2 = sizeof(arr)/sizeof(arr[0]);
	printf("sz2=%d\n", sz2);
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10};
	int sz1 = sizeof(arr) / sizeof(arr[0]);
	printf("sz1=%d\n", sz1);
	test(arr);

	return 0;
}

 

    为什么sz1与sz2同样的代码,结果却不同呢?——因为一维数组传参时,传的是数组名,本质上传递的是数组首元素的地址。因此,函数的形参部分是不会真实创建数组的,那么这里也就不需要传递数组大小 。函数的形参部分应用指针变量来接收。

*注:一维数组传参时,形参写成数组形式主要是为了方便理解。

  4.二级指针

    (1)二级指针实际上就是指向一级指针的指针,以此类推多级指针。

int main()
{
   int a=10;

   int* pa=&a;//pa为指针变量,一级指针变量

   int** ppa=&pa;//ppa就是二级指针变量,用于存放一级指针的地址

   return 0;
}

 

  5.指针数组—存放指针的数组

    (1) int* arr[3] ——存放整形指针的数组,char* arr[8] ——存放字符指针的数组

*同普通数组类似,这里的int*,char*和int,char类似,用于表示数组内元素的数据类型。 

  6.指针数组模拟二维数组

    典例:

#include <stdio.h>
int main()
{
	int arr1[] = { 0,1,2,3,4 };
	int arr2[] = { 3,4,5,6,7 };
	int arr3[] = { 6,7,8,9,10 };

	int* arr[] = { arr1,arr2,arr3 };
	
	for (int i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(*(arr+i))+j);//(arr+i)找到一维数组,进而找的数组内的元素
		}
		printf("\n");
	}

	return 0;
}
  7.字符指针变量

    (1) const char* ps = "abcdef";(这种赋值是将首字符地址赋给ps,这是常量字符串,不可修改,也是一块连续的空间)

不同于 char arr[ ]="abcdef";(非常量字符串)

            char* ps = arr;

    典例:

#include <stdio.h>
int main()
{
	char str1[] = "hello";
	char str2[] = "hello";

	const char* str3 = "hello";
	const char* str4 = "hello";
	if (str1 == str2)
		printf("同\n");
	else
		printf("不同\n");
	if (str3 == str4)
		printf("同\n");
	else
		printf("不同\n");

	return 0;
}

 

    为什么会出现这样的结果呢?请看图解: 

    *str3和str4指向的是常量字符串,内存中不会再开辟一块空间存放相同的常量字符串,因此str3和str4共同指向同一个地址 。

                                                                                                                               ——指针(三)

 

 

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值