1.指针和一维数组
一维数组名是一个指针常量,它存放的是一维数组第一个元素的地址,且它的值不能被改变。
int a[5];
int b[5];
printf("%#x\n",&a[0]); //%#x表示以十六进制输出
printf("%#x\n",a);
=================
编译输出结果一致,但实际输出的结果是垃圾值,因为数组元素没有初始化
可以看出数组名a的值与第一个元素a[0]的地址是等价的,所以可以通过数组变量名访问到第一个元素,于是推导出,数组名是一个指针常量,而不是变量,而且它的值不能被改变,所以a=&a[2]这样的赋值也是不行的。以下是数组下标与指针的关系部分笔记,源自网络:
总结一句话:如果p是个指针变量,则p[i]永远等价于*(p+i)。例如:int a[5]={1,2,3,4,5},则*(a+4)=a[4]=5.
int main(void)
{
int a[6]={1,2,3,4,5,6};
printf("%d\n",a[3]);
f(a,6);
printf("%d\n",a[3]);
return 0;
}
void f(int * pArr,int len) //确定一个数组需要两个参数
{
pArr[3]=88;
}
//最终输出结果为:4 88
第一个输出毫无疑问的是4,第二个的运算过程推导为:主函数中的f(a,6)调用函数"f()",传入两个形参a与6(需要清楚的是,此时的a代表的是一个指针常量,说通俗点就是代表着数组a[]第一个元素的地址)而f()中的pArr[3]又可以看成是*(pArr+3),当主函数中的形参传入时,于是变成了*(a+3)=88,也就是说pArr[3]指向了a[4]的值,当pArr[3]=88时,同时改变了a[4]的值。本质与swap函数互换数值相同。所以还是:改变形参所指向地址的值,但不能改变形参所指向的地址。
2、一个指针变量到底占用几个字节(非重点)
/*
2019年3月13日 09:22:30
功能点:一个指针到底占几个字节
知识点:sizeof()对指针变量的基本应用
*/
#include <stdio.h>
int main(void)
{
char ch='A';
int i=99;
double x=66.8;
char *p=&ch;
int *q=&i;
double *r=&x;
printf("%d %d %d\n",sizeof(p),sizeof(q),sizeof(r));
}
/*
在dev中输出结果为:
-------------------------
8 8 8
-------------------------
Process exited after 0.05985 seconds with return value 0
请按任意键继续. . .
注:在32位、64位系统,或者不同编译器可能会有不同的结果,非重点知识
*/
假设p指向char类型变量(1个字节)
假设q指向int类型变量(4个字节)
假设r指向double类型变量(8个字节)
p q r本身所占的字节是否一样?答案是肯定的
总结一下就是,一个指针变量无论它指向的变量占几个字节,该指针变量本身只占8个字节(4个字节)。