C语言初学者之指针基础总结

定义:

在这里引用百度的定义:

在计算机中, 所有的数据都是存放在存储器中的, 不同的数据类型占有的内存空间的大小各不相同。内存是以字节为单位的连续编址空间, 每一个字节单元对应着一个唯一的编号, 这个编号被称为内存单元的地址。比如: int类型占4个字节, char类型占1个字节等。内存为变量分配存储空间的首个字节单元的地址, 称之为该变量的地址。地址用来标识每一个存储单元, 方便用户对存储单元中的数据进行正确的访问。在高级语言中地址形象地称为指针。

学后

目前学了指针之后,感觉指针像一个箭头→一样可以指向很多东西,比如变量、数组、函数、结构体等等。以下主要想写写指针的部分基础知识;

指针与加减运算符结合

#include<stdio.h>
int main(void)
{
	int *p,a[5]={0,5,12,3,9};
	p=&a[0];
	printf("a[5]={0,5,12,3,9}\n");
	printf("*p=%d\n\n",*p);
	printf("*p++=%d\n\n",*p++);
	printf("*p=%d\n\n",*p);
	printf("*(p++)=%d\n\n",*(p++));
	printf("*p=%d\n\n",*p);
	printf("*p+1=%d\n\n",*p+1);
	printf("*p+2=%d\n\n",*p+2);
	printf("*(p+1)=%d\n\n",*(p+1));
	printf("*p=%d\n\n",*p);
	printf("*(p+3)=%d\n\n",*(p+3));
	printf("*p=%d\n\n",*p);
	printf("*(p+4)=%d\n\n",*(p+4));
	printf("*(p+5)=%d\n\n",*(p+5));
	printf("*(p+6)=%d\n\n",*(p+6));
	printf("*p+2-1=%d\n",*p+2-1);
}

运行结果:
在这里插入图片描述

由此可知:

  • *p表示取指针p所指向的位置的值;
  • *p+i 表示取指针p所指向的位置的值再加上i;
  • *p++表示取指针p所指向的位置的值,再对指针p进行自加(注:并不是指针p的地址值加1)(如在此代码中,指针p的地址值加了4,即一个int数据类型所占用的字节数,使p指向了数组的下一个元素)(指针所指地址已变)
  • 对于*(p++),此时先观察括号中的p++,因为p++是先取值再自增,所以此时p++的值还是原来p的值,故取出来的地址值还是上一步p的地址;(指针所指地址已变)
  • *(p+1)表示取指针p所指向的位置的元素的下一个元素。(指针所指地址未变)
  • 当运行到*(p+3)这一语句时,得到结果居然是0;难道是循环?(对此我们可以试一试,最后我们会发现并不是!);(那么为什么有些为0,有些不为0呢???);

加减就暂时总结到这吧。

指针与数组结合:

*一维数组

  • 数组表达:char arr[N];
    指针表达:char *arr;
    \**\t\t\t\t\t\t**\ arr=(char *)malloc( sizeof(char)*N )

  • 简单应用:1.数组元素为实数、整型、字符。(如上)
    2.数组元素为指针,即指针数组。(如下)

指针数组:实质为数组;
如:int *p[n];
p为指针数组,数组中的n个元素均为指针且指向整型(int)。
代码如下:

#include<stdio.h>	
int main(void)	
{
	int a[3]={10,20,30};
	int *p[3];
	p[0]=&a[0];
	p[1]=&a[1];
	p[2]=&a[2];
	printf("p[0]=%p\n",p[0]);
	printf("a[0]=%p\n",a[0]);
	printf("p[1]=%p\n",p[1]);
	printf("a[1]=%p\n",a[1]);
	printf("p[2]=%p\n",p[2]);
	printf("a[2]=%p\n",a[2]);
	printf("p[0]=%d\n",*p[0]);
	printf("p[1]=%d\n",*p[1]);
	printf("p[2]=%d\n",*p[2]);
}

运行结果:
在这里插入图片描述

*二维数组

注:N为整型常量。

  • 数组表达:char arr[ N ][ N ];
  • 指针表达:char ( *arr ) [ N ];
    —————char **arr;
    —————

指针与函数结合:

注意函数指针与指针函数的区别

  • 函数指针:实质为指针;

    定义格式:函数返回值类型 (*指针名)(形参列表)
    代码如下:

#include<stdio.h>
float px(float x,int y)//函数:求X^y的值;
{
int i;
float t=1;
for(i=0;i<y;i++)
t*=x;
return t;
}
int main(void)
{
	float x,a;
	int y;
	scanf("%f%d",&x,&y);
	float (*p)(float,int);//定义函数指针;
	p=px;		//指针的初始化;即令指针指向函数的首地址;
	//p=&px;	//第二种初始化;
	//(由百度可知:在C语言中函数名中存放的值
	//是函数所占的连续存储单元的首地址)
	a=p(x,y);
	printf("%.3f",a);
}
  1. 指针函数:实质为函数;
    定义格式:函数返回指针的类型 * 函数名(形参列表)
    代码如下:
#include<stdio.h>
float *px(float x,int y)//函数:求X^y的值,并返回一个指针;
{
{
int i;
float t=1,*p;
for(i=0;i<y;i++)
t*=x;
p=&t;
return p;
}
int main(void)
{
	float x;
	int y;
	scanf("%f%d",&x,&y);
	printf("%p\n",px(x,y));
	printf("%f",*px(x,y));
}

运行结果:
在这里插入图片描述
注:当我们在printf语句中把px(x,y)改成px(x,y)+1时,地址值加了4;试思考一下为何是这样的。

指针与结构体结合:

待有时间再写…
未完待续…
试想一下可不可以把数组、指针、函数、结构体等等,多个组合在一起,然后会起到什么作用???
(手动滑稽)

若有错误,欢迎指正!!!
谢谢大家!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值