一、指针和一维数组
1.一维数组名
- 一维数组名是个
指针常量
,存放的是一维数组第一个元素的地址
int a[5];
int b[5];
a = b; //error,常量之间无法赋值
printf("%#X\n",&a[0]);
printf("%#X\n",a); //二者相同
2.下标和指针的关系
确定一个一维数组需要2个参数
数组名
和数组长度
- 如果p是个指针变量,则
p[i]
永远等价于*(p+i)
#include <stdio.h>
//f函数可以输出任何一个一维数组的内容
void f(int * pArr,int len) // a是 int* 类型,所以pArr也要为 int* 类型
{
for(i=0;i<len,i++)
printf("%d",*(pArr+i)); //*(pArr+i)为第i+1个元素,等价于pArr[i]
print("\n");
} /*如果p是个指针变量,则p[i]永远等价于(p+i)*/
int main(void)
{
int a[5] = {1,2,3,4,5};
int b[6] = {-1,-2,-3,4,5,-6};
int c[100] = {1,99,22,33};
f(a,5); // a是 int*类型
f(b,6);
return 0;
}
#include <stdio.h>
void f(int * pArr,int len)
{
pArr[3] = 88; //p[i]永远等价于*(p+i)
}
int main(void)
{
int a[6] = {1,2,3,4,5,6};
printf("%d\n",a[3]); //4
f(a,6);
printf("%d\n",a[3]); //88,p[i]永远等价于*(p+i)
return 0;
}
3.指针变量的运算
- 指针变量不能想加,不能相乘,也不能相除
- 如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减,表示二者之间的元素的个数
#include <stdio.h>
int main(void)
{
int i = 5;
int j = 10;
int * p = &i;
int * p = &j; // p-q,error,没有实际意义
int a[5];
p = &a[1];
q = &a[4];
printf("p和q所指向的单元相隔%d个单元\n",q-p);
return 0;
}
4.一个指针变量到底占几个自节
预备知识:
sizeof(数据类型)
功能:返回值就是该数据类型所占的字节
sizeof(数据名)
功能:返回值就是该变量所占的字节
例:sizeof(int)=4
- p指向
char(1Byte)
类型变量 - p指向
int(4Byte)
类型变量 - p指向
double(8Byte)
类型变量
#include <stdio.h>
int main(void)
{
char ch = 'A';
int i = 99;
double x = 66.6;
char * p = &ch;
int * q = &i;
double * r = &x;
printf("%d %d %d\n",sizeof(p),sizeof(q),sizeof(r));
//4,4,4,和编译器有关
return 0;
}
-
结论:
一个指针变量,无论指向的变量占几个字节,该指针变量本身所占字节数一样大,且和编译器有关。