C语言中的指针

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、C语言中的地址
    • 2.画图理解地址
  • 二、变量指针:
    • 1.变量指针的概念
    • 2.变量指针的定义
    • 3.变量指针的使用
    • 4.指针的加减运算
  • 三、数组指针
  • 四、指针数组
    • 1.一维数组的指针数组
    • 2.二维数组的指针数组
  • 总结

提示:以下是本篇文章正文内容,下面案例可供参考

一、C语言中的地址

1.地址的概念:

我们在创建变量或数组时,系统会为我们申请相对应的地址并开辟空间来存储变量的值,而地址就是指向存储变量空间的一串八个数字的十六进制数。我们可以将存储变量的值的空间看做是房子,而地址是门牌号。

2.画图理解地址

int类型的变量

int数组类型

数组的首地址指向数组的首个元素的地址,他们在数值上是相同的但并不是一个东西。

二、变量指针:

1.变量指针的概念

变量指针类似于变量,只不过其类型为指针类型,我们可以将变量指针看做指针类型的变量,只不过该变量用于存储地址,例如int a = 100;&a就是一个指针,其指向变量a的地址。

2.变量指针的定义

//1.先定义在复制

int a = 100;

int *p  = NULL;

p = &a;

//2.在定义时赋值

int *q = &a;

3.变量指针的使用:

int a = 100;

int b = 300;

int *p = &a;

int *q = &b;

//1.利用变量指针输出所指向对象的值,p表示地址,*p表示内容。

printf("a=%d,b=%d\n", *p, *q);

//2.改变指针的指向

p = &b;//将指针p指向b的地址

q = &a;//将指针q指向a的地址

printf("a=%d,b=%d\n", *q, *p);

//通过指针改变a,b的内容。

*p = 500;//将b的值改为500

*q = 100;//将a的改为100

printf("a=%d,b=%d\n", *q, *p);

//输出指针的大小,指针是固定长度为8个字节。

printf("%d,%d\n", sizeof(p),sizeof(q));

//*p,*q所占字节的大小与其指向变量的类型有关,int类型为4个字节。

printf("%d,%d\n", sizeof(*p), sizeof(*q));

//通过指针输出指向变量的地址

printf("%p,%p", q, p);

4.指针的加减运算

int a = 100;

int *p = &a;

//指针可以进行加减运算,每次加减一个单位(该单位与其指向的变量类型有关)。

//这里p+1=>一次加4个字节的长度。

int *k = p+2;//p向上移动二个单位(八个字节)。

int *m = p-3;//p向下移动三个单位(三个字节)。

画图理解指针的加减运算:

三、数组指针

概念:数组指针本质上是指针,该指针存入的是数组的地址。

1.一维数组的数组指针

int a[5] = {1,2,3,4,5};

int *p = a;//a为数组名,在这里为数组的首地址

//利用指针输出数组a的元素值

printf("%d\n", *p);

printf("%d\n", *(p+1));

printf("%d\n", *(p+2));

printf("%d\n", *(p+3));

printf("%d\n", *(p+4));

//p表示数组a的首地址,则p[0] <=> a[0]

printf("%d\n", p[0]);

printf("%d\n", p[1]);

printf("%d\n", p[2]);

printf("%d\n", p[3]);

printf("%d\n", p[4]);

//p还满足交换律,p[0] => *(p+0) => *(0+p) =>0[p]

printf("%d\n", 0[p]);

printf("%d\n", 1[p]);

printf("%d\n", 2[p]);

printf("%d\n", 3[p]);

printf("%d\n", 4[p]);

//利用指针p输出数组各个元素的地址,指针像地址一样可以加减运算

printf("%p\n", p);

printf("%p\n", p+1);

printf("%p\n", p+2);

printf("%d\n", p+3);

printf("%d\n", p+4);

2.二维数组的数组指针

int a[3][4] = {{1,2,3,4},{10,20,30,40},{11,22,33,44}}

//优先级() >[] > *

/*数组指针本质上是指针,我们可以拆分来看(*p)表示该变量是一个指针,int[3]表示该指针指向int[3]类型的地址,本次案例指向地址a[0],也就是a数组的首元素的地址。*/

int (*p)[3] = a;

// 练习通过p将 2,10,40,33,44打印出来

printf("%d\n", p[0][1], (*p)[1], *(*(p+0)+1), *(p[0]+1));//输出2

printf("%d\n", p[1][0], (*(p+1))[1], *(*(p+1)), *(p[1]));//输出10

printf("%d\n", p[1][3], (*(p+1))[3], *((*(p+1))+3), *(p[1]+3);//输出40

printf("%d\n", p[2][3], (*(p+2))[3], *((*(p+2))+3), *(p[2]+3));//输出44

四、指针数组

概念:指针数组本质上是数组,只不过该数组内存放的是指针。

1.一维数组的指针数组

char *p = "jackken";

//输出第一个字符

printf("%c\n", p[0]);

//输出指针所占的字节数

printf("%d\n", sizeof(p));

2.二维数组的指针数组

char buf[3][4] = {"jack","rose","ken"};

/*指针数组pbuf,相当于一个char 类型的数组数组里面有三个指针,每个指针对应一个字符串的地址。*/

char *pbuf[3] = {"jack","rose","ken"};

//输出元素的内容

printf("%d\n", pbuf[0]);//输出"jack"

printf("%d\n", pbuf[1]);//输出"rose"

printf("%d\n", pbuf[2]);//输出"ken"

//输出地址

printf("%d\n", pbuf);//输出"jack"的地址

printf("%d\n", pbuf);//输出"rose"的地址

printf("%d\n", pbuf);//输出"ken"的地址


总结

指针在C语言中比较复杂,特别是数组指针与指针数组的概念别搞混了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值