C语言中指针及其应用基础篇(指针变量,指针和数组)

一、指针变量

1.1代码分析

先把代码贴上来进行分析。 笔者在写代码时候会加上头文件stdlib和代码system("pause");这是为了防止闪屏,在学校时候老师有教过其他写法,但是还是觉得笔者这样写比较容易记得住。

1#include<stdio.h> 2#include<stdlib.h> 3 4int main() { 5 int var = 20; 6 int *p; //定义指针变量 7 p = &var; //把存储var变量的地址赋值给指针*p 8 printf("Address of var is :%p\n", &var); 9 printf("Address stores in p:%p\n", p); 10 printf("Value of var is :%d\n", *p); 11 12 int x = 30; 13 int *pInt = &x; 14 printf("%d\n", pInt); 15 printf("%d\n", (pInt + 1)); 16 system("pause"); 17 return 0; 18}

1.2使用指针时候,会频繁进行如下操作:

(1)定义指针变量, (2)把存储刚刚定义的变量如var=20的地址,赋值给指针变量, (3)访问指针变量中可用的地址的值。 指针变量定义形式:数据类型 指针变量名称,比如上面的int *p。 指针变量的使用:如 p=&a,通过取地址符&,获取 a 的地址,赋值给指针变量。 通过指针来获取地址中存储的内容:在打印中直接使用 *p。

1.3指针与整数的加减运算:

指针变量的自增自减运算。指针加 1 或减 1 运算,表示指针向前或向后移动一个单元(不同类型的指针,单元长度不同)。这个在数组中非常常用。 指针变量加上或减去一个整形数。和第一条类似,具体加几就是向前移动几个单元,减几就是向后移动几个单元。

输出的结果如图:在这里插入图片描述

这里要说一点就是,printf打印的时候,%x和%p,%d都可以打印出来内存地址,但是%x会把地址开头的一串0去掉,%p不会,而%d则是为了方便直观的观察指针指向地址的变化。

二、一级指针和一维、二维数组

2.1.1代码分析

1#include<stdio.h> 2#include<stdlib.h> 3 4int main() { 5 //One-Dimensional ArrayList Method-One 6 int arr[] = { 1,2,3,4,5,6,7 }; 7 int *pInt = arr; 8 for (int i = 0; i < 7; i++) { 9 printf("%d=%d\t", arr[i], *(pInt + i)); 10 } 11 printf("\n"); 12 //Method-Two 13 for (int i = 0; i < 7; i++) { 14 printf("%d\t", pInt[i]); 15 } 16 printf("\n\n"); 17 18 //Two-Dimensional ArrayList Method-One 19 int SecArr[3][3] = { 1,2,3,4,5,6,7,8,9 }; 20 int(*pSec)[3] = SecArr; 21 for (int i = 0; i < 3; i++) { 22 for (int j = 0; j < 3; j++) { 23 printf("%d\t", *(*(pSec + i)+j)); 24 } 25 printf("\n"); 26 } 27 printf("\n"); 28 29 //Method-Two 30 int SecArrayList[3][3] = { 1,2,3,4,5,6,7,8,9 }; 31 int(*pSecArr)[3] = SecArrayList; 32 for (int i = 0; i < 3; i++) { 33 for (int j = 0; j < 3; j++) { 34 printf("%d\t", *(pSecArr[i] + j)); 35 } 36 printf("\n"); 37 } 38 39 system("pause"); 40 return 0; 41}

首先我们定义一个长度为7的一维数组,分别存放整数从1到7,数组的首地址,即为数组名arr。定义一个一级指针为pInt且将数组首地址赋值给指针变量pInt。如下图所示。 在这里插入图片描述 数组其实是一段内存。如图,指针pInt指向的地址为数组的首地址,然后,我们就进行循环遍历了。这里用了两种方法。 第一种如One-Dimensional Method-One中所写,因为已经对指针变量进行赋值操作,可以从首地址开始,对指针进行移动,从元素1移动元素2,随着每次循环,再移动到3这样,然后再移动。 第二种方法,如One-Dimensional Method-Two所写,因为指针变量可以这里当做数组名使用,直接用pInt[i]作为arr[i]来使用。

二维数组

在这里插入图片描述 如上面代码中 //Two-Dimensional ArrayList Method-One部分。道理如上面的一维数组如出一辙,定义二维数组,定义指针变量,因为一维数组有int *pInt = arr;二维数组时候也成立,因此pSec[3] = SecArr[3][3],那么,int(*pSec)[3] = SecArr;就容易理解了。在循环遍历时候如上图,记住一维数组可以理解成为一行字,二维数组就是一页字,同理三维数组就是一书。这样比喻,会更加容易理解。类似的,*(*(pSec + i)+j)可以把*(pSec + i)看做整体。*(pSecArr[i] + j)可以把pSecArr[i]看做整体。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

PhoneGap设置Icon

参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi