指针变量
变量的值是内存的地址
普通变量的值是实际的值
指针变量的值是具有实际值的变量的地址
作为参数的指针
void f(int *p);
在被调用的时候得到了某个变量的地址
int i=0;f(&i);
在函数里面可以通过指针访问外面的这个i
访问那个地址上的变量*
*是一个单目运算符,可以访问指针的值所表示的地址上的变量
可以做右值也可以做左值
int k=*p;
*p=k+1
int num = 10;
float score = 45.8;
//声明变量的本质是在内存中开辟一块空间
//取出变量在内存中的空间,&取地址符
//打印地址,%p
//将取出的地址保存起来? 专门保存地址的变量----》指针变量(也是变量,只不过)
int* p=#//类型:int*
//打印num的值
printf("num=%d\n",num);
//打印num的地址
printf("&num=%p\n",&num);
//打印p的值
printf("p=%p\n",p);
//打印p的地址
printf("&p=%p\n",&p);
//p变量在内存中开辟多大空间?sizeof 指针类型在内存中分配的空间是8个字节(64位),4个字节(32位)
float* q=&score;//float*
float** path = &q;
printf("----%zd\n",sizeof(int*));
printf("----%zd\n", sizeof(float*));
printf("----%zd\n", sizeof(char*));
printf("----%zd\n", sizeof(short*));
printf("----%zd\n", sizeof(unsigned*));
printf("----%zd\n", sizeof(float**));
printf("*&num=%d\n",*&num);//*&num=num,*&可以抵消
printf("*&num=%d\n", *p);
传入地址
为什么 int i;scanf("%d",i); 编译没有报错
传入函数的数组变成了什么?
int isPrime(int x,int knowPrimes[],int numberofknowPrimes)
{
int ret=1;
int i;
for(i=0;i<numberofknowPrimes;i++)
{
if(x%knowPrimes[i]==0)
{
ret=0;
break;
}
}
return ret;
}
函数参数表中的数组实际上是指针
sizeof(a)==sizeof(int *)
但是可以用数组运算符[]进行运算
数组参数
以下四种函数原型是等价的:
int sum(int *ar,int n); int sum(int *,int); int sum(int ar[],int n); int sum(int [],int n).
数组变量是特殊的指针
数组变量本身表达地址,所以
int a[10];int *p=a;//无需用&取地址
但是数组的单元表达的是变量,需要用&取地址
a==&a[0];
[]运算符可以对数组做,也可以对指针做
p[0]<==>a[0]
*运算符可以对指针做,也可以对数组做;
*a=25;
数组变量是const的指针,所以不能被赋值
int a[]<==>int *const a=.....(常量指针:一但创建,就不能改变)
指针还是数组?
char *str="hello";
char word[]="hello";
数组:这个字符串在这里
作为本地变量空间自动被回放
指针:这个字符串不知道在哪里
处理参数 如果要构造一个字符串——>数组
动态分配空间 如果要处理一个字符串——>指针
float scores[5] = { 23,54,63,89,77};//float[5]
//数组名---》首元素的地址
float* p = &scores[0];
float* p2 = scores;
int size = sizeof(scores) / sizeof(scores[0]);
//打印数组中的每个元素
for (int i = 0; i < size; i++) {
printf("scores[%d]=%.2f\n", i, scores[i]);
printf("*(scores+%d)=%.2f\n", i, *(scores+i));
printf("p2[%d]=%.2f\n", i, p2[i]);
printf("*(p2+%d)=%.2f\n", i, *(p2+i));
}
float(*pArr)[5] = &scores;//数组指针 float(*)[5]
int(*p)[5] = &arr;//数组指针
//指针数组
int a = 1;
int b = 2;
int* p1 = &a;
int* p2 = &b;
int* pArr[] = { p1,p2 };