指针与数组
#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];
指针函数和函数指针:
指针函数:本质上就是一个函数,只不过其返回值为某个类型的指针!!!
函数指针:本质上是一个指针,指向了一个函数的实现地址,通过这个指针可以去调用它指向的函数!!!
所以谁修饰谁是很重要的。