指针和数组的关系

我们通常所说的数组名其实是数组首元素的地址,所以在传参的时候通常传过去的是数组首元素的地址。

void test(int arr[9])
{
	//因为传过来的参数是数组首元素的地址
	printf("%d\n", sizeof(arr));
}


int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	//将arr传过去
	test(arr);
	//sizeof关键字求得是arr整个数组的大小
	printf("%d\n", sizeof(arr));
	return 0;
}

 所以结果会大不一样

 当然,我们也可以用指针去接收它。

void test(int *arr)
{
	//因为传过来的参数是数组首元素的地址
	printf("%d\n", sizeof(arr));
}


int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	//将arr传过去
	test(arr);
	//sizeof关键字求得是arr整个数组的大小
	printf("%d\n", sizeof(arr));
	return 0;
}

这是一维数组和指针之间的关系。那么二维数组呢?

二维数组是用[][]来定义的,分几行几列

其中数组名是数组首元素的地址,

而arr[0]代表第一行的数组名,数组名有代表数组首元素的地址,所以

arr[0]就代表了第0行第一个元素的地址了。

那么这样看来,arr是地址,arr[0]是地址

所以要找到这个数组里面的内容是不是要用个数组指针呢?

说到数组指针,它就是一个指针,指向一个数组其中有多少个元素。

形式是这样的

int (*arr)[10]  加括号是想让arr先与*号结合成为指针,后面的[]表示指针指向的是一个数组,数组有10个元素。

void test(int(*arr)[3])
{
	int a = 0;
	int b = 0;
	(*arr + 1)[0] = 3;
	*((*arr + 1) + 0) = 3;
	b = (*arr + 1)[0];
	a = *((*arr + 1) + 0);
	printf("%d\n", a);
	printf("%d\n", b);
}

int main()
{
	int arr[3][3] = { 0 };
	test(arr);
	return 0;
}

其中(*arr + 1)[0] = 3;
    *((*arr + 1) + 0) = 3;

这两个其实是等价的,也就是说可以用*号(解引用操作)来代替[][]。

结果如下:

 

指针数组在计算机编程中密切相关,它们之间的关系可以从以下几个方面描述: 1. **数组名作为指针**:在大多数语言中,数组名本身就是对该数组首元素的地址(或者说指针),可以看作是一个指向数组首元素的常量指针。这意味着你可以使用数组名去间接访问数组的所有元素。 ```c int arr[5] = {1, 2, 3, 4, 5}; int* ptr = arr; // arr实际上就是一个指针,它指向第一个元素arr[0] ``` 2. **数组元素的访问**:通过指针,我们可以直接操作数组的每个元素,就像访问单个变量一样。比如 `ptr[i]` 就等同于 `arr[i]`。 3. **指针遍历数组**:由于数组连续存储的特点,通过指针可以方便地遍历整个数组,这对于算法设计数据处理非常有用。 4. **数组长度指针调整**:虽然数组名本质上是个指针,但我们通常不需要关心它的长度信息。但是如果你有一个指针,并且需要知道数组长度,你可以计算出从初始位置到数组末尾的距离(通常是`sizeof(arr)/sizeof(arr[0])`)。 5. **一维数组动态分配的类似结构**:在某些情况下,我们可能会创建一个动态大小的数组,这时就更像一个动态分配的数组,通过指针对其进行操作。指针在这种情况下提供了一定的灵活性。 6. **指针数组**数组也可以包含指针,形成指针数组,这允许你在数组中存储其他数组或对象的地址。 总的来说,数组指针可以互相转换使用,但理解正确运用两者之间的关系对于高效编程至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值