1.指针和一维数组

一维数组名是一个指针常量,它存放的是一维数组第一个元素的地址,且它的值不能被改变。

int a[5];
int b[5];
printf("%#x\n",&a[0]);    //%#x表示以十六进制输出
printf("%#x\n",a);

=================
编译输出结果一致,但实际输出的结果是垃圾值,因为数组元素没有初始化

可以看出数组名a的值与第一个元素a[0]的地址是等价的,所以可以通过数组变量名访问到第一个元素,于是推导出,数组名是一个指针常量,而不是变量,而且它的值不能被改变,所以a=&a[2]这样的赋值也是不行的。以下是数组下标与指针的关系部分笔记,源自网络:

4、指针与数组

 总结一句话:如果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个字节)。

 

 

相关文章:

猜你喜欢
  • 2022-01-19
  • 2021-06-04
  • 2021-08-21
相关资源
相似解决方案