对C语言指针的学习与理解

一.指针是什么?

–指针一直是C语言学习过程中的一座大山,今天趁冬至谈一谈对指针的理解
1.指针在计算机中,是编程语言的一个对象,利用地址,它的值直接指向存在电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化称为“指针”,即通过它找到以它为地址的内存单元。以上是官方解释,但我觉得过于抽象。
2.通俗说,指针就像宿舍楼里每个宿舍的门牌号,宿舍就是存储单元,住在宿舍里的学生就是存储的数据元素,通过宿舍门牌号才能快速并精准的定位到某某数据的位置,所以指针的优点就是帮助我们提高了查找内存位置的效率
3.那么指针到底是什么
指针就是个变量,存放内存单元的地址

int main()
{
int a=10;//在内存中开辟一块空间
int *p=&a;//这里我们对变量a,取出它的地址,然后将a的地址存放在p变量中
return 0}

4.指针是用来存放地址的,地址是唯一标示一块地址空间的,并且指针的大小在32位平台是4个字节,在64位平台是8个字节

二.指针的类型

1.字符指针char*)

int main()
{
char ch ='w';
char *pc = &ch;
*pc ='w';//指针解应用,所指向的目标就是ch
return 0;
}

2.指针数组/数组指针(存放指针的数组)

int* arr1[10];//整形指针的数组
char* arr2[4];//一级字符指针的数组
char** arr3[5];//二级字符指针的数组

①数组指针

int (*p2)[10]
p先和 * 结合,说明 p是一个指针变量,然后指针指向的是一个大小为10个的数组,所以p是一个指针,指向一个数组,叫数组指针
因为 [ ] 的优先级要高于 * ,所以必须加上()来保证 p 先和 * 结合

②&arr与arr的区别

arr表示数组名,代表的是数组首元素地址
&arr 表示的是数组的地址
arr = &arr[0]
注意:
a.数组名在sizeof中单独出现代表整个数组
b.数组名取地址代表整个数组
c.其他情况,数组名都代表首元素的地址

③arr+1与&arr+1的区别

arr + 1 下一个元素
&arr + 1下一个数组
数组的+1,跳过整个数组的大小

3.二级指针

int a=10; a 10 0x0018ff44
int *pa=&a pa 0x0018ff44 0x0018ff40
int **ppa=&pa ppa 0x0018ff40 0x0018ff3c

a的地址放在pa中,pa的地址存放在ppa中,pa是一级指针,而ppa是二级指针

三.指针与函数

1.指针作为函数参数
①一级指针传参

#include <stdio.h>
void print(int *p, int sz) {
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d\n", *(p+i));
 }
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9};
 int *p = arr;
 int sz = sizeof(arr)/sizeof(arr[0]);
 //一级指针p,传给函数
 print(p, sz);
 return 0; }

②二级指针传参

#include<stdio.h>
void test(int **ptr)
{
printf("num=%d\n",**ptr);
}
int main()
{
int n=10;
int *p=&n;
int **p=&p;
test(pp);
test(&p);
return 0;
}

总结:①:函数形参为指针变量,用指针变量作为实参
②函数形参为指针变量,用变量地址作为实参

2.指向函数的指针
变量与特定的单元相联系,通过变量名可以得到变量的存储地址。
一个函数包括一组指令序列,存储某一段内存中,这段内存空间的起始地址称为函数的入口地址,通过函数名可以得到这一地址。相反,也可以通过该地址找到这个函数,,所以函数的入口地址为函数的指针。

定义形式为:
类型标识符(* 指针变量名)();
eg:int( *p)(); float( *q)();
表示p指向一个返回整型值的函数,q指向一个返回浮点型值的函数

int( * p)();int *p();的区别

> 前者定义的是p为一个指针变量(指向函数)
> 后者定义p是一个函数,其返回值为指针

后续有对指针新的理解还会更新。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值