C语言 指针与数组

基础

  1. 数组名=数组首元素指针
  2. 用数组名的解引用buf来访问第一个元素,也可以使用(buf+N)来访问第N个元素。

数组指针(类型为元素,类型为整个数组)和指针数组

  1. 指向数组的指针常被简称为数组指针(array pointer),包含两种情况一个是指向元素的首个元素地址,另一个是指向整个数组,虽然二者地址值相同,但是指针类型不同.
  2. 而具有指针类型元素的数组则被称为指针数组(pointer array)
  3. 主要应用是数组指针的第一种,既指向数组首元素的指针
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[5] = { 1,2,3,4,5 };
	printf("%x,%x", a, &a); // a和&a的地址是相同的,既数组名=数组首元素指针
	printf("\n%d,%d", sizeof(*a), sizeof(*(&a))); // 但是a指针类型(*a)是数组的一个元素,而&a指针类型*(&a)是整个数组
	int *p1 = a;//指向元素的指针,每个元素占四个字节
	int(*p2)[5] = &a;//指向数组的指针,内存长度是所有元素的和//区别于int *p2[5],这个是建立了一个数组,数组的元素全是指针
	printf("\n%d,%d", sizeof(*p1), sizeof(*p2)); //和sizeof(*a), sizeof(*(&a))等价
	system("pause");
}

参考:http://c.biancheng.net/view/368.html

数组指针(元素)

数组变量名既是指针

  1. p=&a; //将变量地址赋值给指针
  2. p=array; //将数组地址赋值给指针
  3. p=&array[i]; //将数组元素赋值给指针
  4. p1=p2; // 将指针地址赋值给指针
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int arr[10] = { 10 };//数组名是数组的首地址,是一个常量,它就是一个指针
	for (int i = 0; i < 10; i++) {
		printf("%d\n", arr[i]);//因为数组名=数组首元素指针,既arr就是一个指针类型,其大小是数组第一个元素大小
	}
	int* p = arr;
	for (int i = 0; i < 10; i++) {//指向数组的指针,当操作指针的时候,间接操作
		printf("%d\n", p[i]);//和printf("%d\n", arr[i]);本质相同,因为数组名=数组首元素指针,既arr就是一个指针类型,其大小是数组第一个元素大小
	}
	system("pause");
}

*(p+1)*p++

  1. 指针运算*(a+i)遍历数组
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[5] = { 1,2,3,4,5 };
	printf("数组名地址:%x,数组第一个元素地址:%x 相同\n", a,&a[0]);//打印数组的首地址
	for (int i = 0; i < 5; i++) {//下标循环
		//打印数组元素的值
		printf("%d,%d\n", a[i], *(a + i));//a是一个地址值,a+1表示地址值前进一个该类型大小的字节
		//打印数组元素的地址
		printf("%x,%x\n", &a[i], a + i);
	}
	for (int *p = a; p < a + 5; p++) {//指针循环
		printf("\n%d,%x", *p, p);
	}
	system("pause");
  1. 指针运算*a++遍历数组
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[5] = { 1,2,3,4,5 };
	for (int *p = a; p < a + 5; p++) {//*(p+1)和*p++意义不相同,前者没有改变p的地址,而后者改变了p的地址
		printf("%d,%x\n", *p, p);
	}
	system("pause");
}

二维数组

a[i][j]=*((a+i)+j)
&a[i][j]=
(a+i)+j
a[i]=*(a+i)
&a[i]=a+i

#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	printf("%x, %d", &a, sizeof(*&a));//&a是整个数组,长度4*3*3个字节
	printf("%x, %d", a, sizeof(*a)); //a是行地址(二维数组中,行是一个元素,一维数组元素是一个元素),长度4*3字节
	printf("%x, %d", *a, sizeof(**a)); //*a元素地址,长度4*1字节,多重指针
	
	
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d,%x ", a[i][j], &a[i][j]);
		}
		printf("\n");
	}
	printf("\n   %x    %x    %x", *a, *a + 1, *a + 2);//分别代表第0行的第一/二/三个元素,地址每次前进4*1个字节
	printf("\n   %x    %x    %x", a, a + 1, a + 2);//分别代表第0行,第1行,第2行的地址,地址每次前进4*3个字节

	system("pause");
}

指针数组

#include <stdio.h>
int main(int argc, char *argv[])
{
	int a = 10;
	int b = 20;
	int c = 30;
	int* arr[] = { &a,&b,&c };
	//arr[0] == &a;
	*arr[0] = 100;
	printf("%d\t%d\t%d\t", a, b, c);
	system("pause");
	return 0;
}

参考:
https://www.cnblogs.com/downey-blog/p/10469906.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值