C语言指针2(指针和数组、指针运算)

一、指针和数组

1、数组名

数组名字是数组的首元素地址,它是一个常量不能修改。a[2] 相当于地址(a)+下标的偏移(2)

int a[] = { 1,2,3,4,5,6,7,8,9 };
printf("a=%p\n", a);
printf("&a[0]=%p\n", &a[0]);

//a=000000B3484FF968
  &a[0]=000000B3484FF968

2、指针操作数组元素

#include <stdio.h>
int main(void)
{
	int* p;
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	p = arr;
	printf("%d\n", *p); //打印数组首元素(1)
	for (int i = 0; i < 9; i++)
	{
		printf("%d\n", arr[i]);
		printf("%d\n", p[i]); //两者打印的是一个东西
	}
	return 1;
}

其中还等同于:

for (int i = 0; i < 9; i++)
	{
		printf("%d\n", arr[i]); //还能改成:
        printf("%d\n",*(arr+i)); //*()即为取值,地址加偏移量再取值
        printf("%d\n",*(p+i));
	}

若我想得到arr[1]也就是2,则应该是*(arr+1),而不是*(arr+4),尽管指针大小为4 个字节,但             指针类型变量+1  ==  内存地址+sizeof(int)

          arr + 1          ==      &arr +4

int b;
int *p;
p=&b;

 p+1 == &b+sizeof(int)

for (int i = 0; i < 9; i++)
	{
		printf("%d/n", *p++);//也是一样的
    }

 但这里的p++就和arr不相等了,因为arr为常量是不会变的。

3、总结

int main(void)
{
	
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int* p = arr; //指向数组的指针
	for (int i = 0; i < 9; i++)
	{
		//数组的元素可以表示为:p[i]||*(p+i)
		//p是变量   arr是常量
		//p是一个指针4个字节大小  arr是一个数组40个字节大小
	}
	return 1;
}

4、指针数组和数组指针

指针数组和数组指针的区别就是符号的优先级:() > [] > * 

 指针数组:指针的数组 char* q[4]

是一个长度为4的数组里,放了4个char*类型的指针,这些指针存放着对应常量的首地址,大小为16个字节。eg:char* q[]={ "lys" , "is" , "so" , "handsome" }

数组指针:数组的指针 (char*)q[4]

这是一个指针,指向长度为4的一维数组,即指向一个char[4],存放的是一个数组的地址,大小为4个字节。

 二、 指针运算

1)指针加减偏移量:指针的加减运算和指针的类型有关

#include <stdio.h>
int main(void)
{
	
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p;
	p = arr;
	p++;  //指针类型+1==地址加sizeof()
	printf("%p\n", p);
	printf("%p", arr);
	return 0;
}
//0000001BB534F51C
//0000001BB534F518

 2)指针减指针:得偏移量

#include <stdio.h>
int main(void)
{
	int step;
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p;
	p = &arr[3];
	step = p - arr;
	printf("%d", step);
	return 0;
}
 //3

注意:指针之间不能作+、*、/、%等等,因为得到的是野指针无意义。

补:!!数组arr[-2]会越界,指针不会,p[-2]相当于*(p-2)。

#include <stdio.h>
int main(void)
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p;
	p = &arr[3];
	printf("%d", p[-2]);
	return 0;
}
 //2

 3)条件判断:

#include <stdio.h>
int main(void)
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p;
	p = &arr[3];
	if (p > arr) {
		printf("lys handsome boy\n"); //比较二者的地址谁大
	}
	return 0;
}
 //lys handsome boy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值