c语言指针

                                                       指针变量

变量的值是内存的地址

  普通变量的值是实际的值

  指针变量的值是具有实际值的变量的地址

                                                    作为参数的指针

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 }; 
                                   

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值