C语言复习整理(八)——指针与数组

指针与数组

#include<stdio.h> 
   
int main(int argc, char *argv[])
{
int a[5] = { 1, 3, 5, 7, 9 };
printf("%d \n",a);
printf("%d \n",a+1);
printf("%d \n",a-1);
printf("%d \n",&a);
printf("%d \n",&a);
printf("%d \n",&a+1);
printf("%d \n",&a-1);
printf("%d \n",*a);
printf("%d \n",*a+1);
printf("%d \n",*a-1);
printf("%d \n",*(a+1));
printf("%d \n",*(a+4));
}
/*
1289022512 
1289022516 
1289022508 
1289022512 
1289022512 
1289022532 
1289022492 
1 
2 
0 
3 
9 
*/

a是数组名,同时在内存方面,a表示数组第一个元素的首地址,这里需要与&a区别开来,&a表示数组的首地址,两者的意义不同,但是数值上一般是相同的,但是与也有不同的情况出现,这里会涉及到大端小端的概念。
a)、a与&a的数值是一样的,都是000000A7B855F6E8,指向了同一个内存地址,但是要区分开来,两者意义不同;
b)、&a+1表示数组a的下一个数据的地址,因为a是一个包含5个int型元素的数组,所以&a+1为&a+sizeof(int)*5,64bit下,int是4字节,所以加20,也就是加14(这里是16进制表示);
c)、同样,&a-1表示a的上一个数据,并且,编译器在这里将其大小与a一样,所以&a-1 = &a-sizeof(int)*5;
e)、a是数组第一个元素的首地址,所以a+1是数组的第二个元素首地址,与a相差4byte;
f)、a-1则表示数组的上一个“数组的最后一个元素的首”地址,当然,这个“数组”可能不存在或者未必是数组,所以以本数组a为参考,取一个int型为差值,所以相差4byte。

#include<stdio.h>
//&取地址printf("%d\n", &a); 输出地址值 
//printf("%d\n",(char *)&a) ; 地址值转换为字符类型输出 
//printf("%d\n", *(char *)&a) ; 输出指针指向的字符类型的地址里面存的变量值 
int main(int argc, char *argv[])
{
	int a = 1;
	printf("%d\n",&a);
	printf("%d\n", (char *)&a);
	printf(" %d\n",(printf("%d", (char *)&a)));
	printf("%d\n", *(char *)&a);
}
#include<stdio.h> 
#include<string.h>
//char类型为1字节  数组前五个元素是十六进制数,两位十六进制数相当于一个字节
//(char *)a 意义是把数组a的元素强制类型转化为字符 
//从低位开始截取 第一个元素0x6f796958 从低位向高位开始截取,先截取58=5*16+8=88=X 
//然后是69  78  6f  直到最后的 0x694c2075  的75 第3个元素为0 强制转换为字符,字符串结束符'\0'的ASCII是0,转换结束
//至此 printf("%s", (char *)a) 执行完   返回了一个数值   是printf的默认返回值,意义为有效输出的数据个数
//printf("  %d", printf("%s", (char *)a));  第一个%d输出的是后面的  printf("%s", (char *)a)的返回值        
int main(int argc, char *argv[])
{
	int a[6] = {0x6f796958, 0x694c2075,0};
	printf("  %d", printf("%s", (char *)a));
	return 0;
}
#include<stdio.h> 
#include<string.h>
//*指针指向第一个字母的地址,*str+1操作对这个字符串第一个地址存的字符+1 
int main(int argc, char *argv[])
{
	char *str = "Xiyou";
	printf("%c\n", *str + 1);
	return 0;
}
#include<stdio.h>
int main()
{
	int a[3][3]={1,3,3,4,5,6,7,8,9};
	printf("%d ",**a);//*a指向a[0]地址,**a指向a[0][0]地址存的值
	printf("%d ",**(a+1));//a+1等价于a[1]地址,**(a+1)指向a[1][0]地址存的值
	printf("%d ",*(*a+1));//*a指向a[0]地址,*a+1指向a[0][1]的地址,*(*a+1)指向地址a[0][1]存的值
	printf("%d ",**a+1);//等价于a[0][0]+1
	return 0;
}
//输出结果为:1 4 3 2 

数组指针、指针数组

1、指针数组,也就是一个数组,每个元素为一个指针:
int p1[10];//或者应该写成 int p1[10];

2、数组指针,也就是一个指针,指向一个数组的指针:
int (*p2)[10];
在这里插入图片描述
指针函数和函数指针:
指针函数:本质上就是一个函数,只不过其返回值为某个类型的指针!!!
函数指针:本质上是一个指针,指向了一个函数的实现地址,通过这个指针可以去调用它指向的函数!!!
所以谁修饰谁是很重要的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值