指针是一个变量,其值为另一个变量的地址。

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。

下面从4个代码例子分别讲述以下4个知识点:

(1) 指针概念

(2) 数组中指针的递增/递减

(3) 指针数组&数组指针

(4) 指向指针的指针

 #include <stdio.h>

 // (1)指针概念
void example1();
// (2)数组中指针的递增/递减
void example2();
// (3)指针数组&数组指针
void example3();
// (4)指向指针的指针
void example4(); int main() {
example1();
example2();
example3();
example4();
return ;
}
void example1() {
// &: 取地址运算符,&a即为a的地址
// *: 指针运算符(取内容运算符),*p即为p所指向的变量
int a = ;
int *p;
p = &a; // [or] *p = a;
// [或直接写成] int *p = &a; [不能写成] *p = &a;/int *p = a;
// 指针变量*p的值[p]为变量a的地址
printf("[p] = %p\n", p); //[p] = 0x7ffeeeb03b5c
// 直接使用指针[*p]访问变量a的值(即表示此指针指向的内存地址中存放的内容)
printf("[*p] = %d\n", *p); //[*p] = 10
// 指针p同时也是个变量,要为其分配内存地址,而[&p]就表示编译器为变量p分配的内存地址
printf("[&p] = %p\n", &p); //[&p] = 0x7ffeeeb03b50
printf("--------------------------\n");
}
void example2() {
int i, j;
// int类型指向下一个整数位置后,当前位置往后移4个字节。
int arr1[] = { , , };
int *parr1 = arr1;
// [or] int *parr1 = &arr1[0];
for (i = ; i < ; i++) {
printf("Address:\tarr1[%d] = %p\n", i, parr1);
printf("Value:\tarr1[%d] = %d\n", i, *parr1);
parr1++;
}
/* output
Address: arr1[0] = 0x7ffeeeb03b30
Value: arr1[0] = 10
Address: arr1[1] = 0x7ffeeeb03b34
Value: arr1[1] = 20
Address: arr1[2] = 0x7ffeeeb03b38
Value: arr1[2] = 30
*/
printf("--------------------------\n");
// long类型指向上一个整数位置后,当前位置往前移8个字节。
long arr2[] = { , , };
long *parr2 = &arr2[];
for (j = ; j > ; j--) {
printf("Address:\tarr2[%d] = %p\n", j, parr2);
printf("Value:\tarr2[%d] = %d\n", j, *parr2);
parr2--;
}
/* output
Address: arr2[3] = 0x7ffeeeb03b20
Value: arr2[3] = 90
Address: arr2[2] = 0x7ffeeeb03b18
Value: arr2[2] = 80
Address: arr2[1] = 0x7ffeeeb03b10
Value: arr2[1] = 70
*/
printf("--------------------------\n");
}
void example3() {
int i;
// 指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
// 数组指针:a pointer to an array,即指向数组的指针
int arr[] = { , , };
//指针数组的赋值
int *p1[];
for (i = ; i < ; i++) {
p1[i] = &arr[i];
}
//数组指针的赋值
int (*p2)[] = &arr;
printf("%d\t%d\t%d\n", *p1[], *p1[], *p1[]); // 100 200 300
printf("%d\t%d\t%d\n", (*p2)[], (*p2)[], (*p2)[]); // 100 200 300
}
void example4() {
int var = ;
int *ptr;
int **pptr;
// 获取var的地址
ptr = &var;
// 获取ptr的地址
pptr = &ptr;
// var = *ptr = **pptr
printf("var = %d; *ptr = %d; **pptr = %d;\n", var, *ptr, **pptr); // var = 1000; *ptr = 1000; **pptr = 1000;
// &var = ptr
printf("&var = %p; ptr = %p;\n", &var, ptr); // &var = 0x7ffeeeb03b44; ptr = 0x7ffeeeb03b44;
// &ptr = pptr
printf("&ptr = %p; pptr = %p;\n", &ptr, pptr); // &ptr = 0x7ffeeeb03b38; pptr = 0x7ffeeeb03b38;
}

C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针的更多相关文章

  1. 剑指Offer 28. 数组中出现次数超过一半的数字 (数组)

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  2. JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  3. C#基础知识汇总(不断更新中)

    ------------------------------目录---------------------------- 1.隐式类型2.匿名类型3.自动属性4.初始化器5.委托6.泛型7.泛型委托8 ...

  4. Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

    1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...

  5. Java基础知识强化21:Java中length、length()、size()区别

    1.java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.2.java中的length()方法是针对字符串String说的,如果想看这个 ...

  6. [饭后算法系列] 数组中"和非负"的最长子数组

    1. 问题 给定一列数字数组 a[n], 求这个数组中最长的 "和>=0" 的子数组. (注: "子数组"表示下标必须是连续的. 另一个概念"子 ...

  7. 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组

    剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...

  8. 4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II

    第一次做到数组双指针的题目是80: 因为python的List是可以用以下代码来删除元素的: del List[index] 所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下: n = ...

  9. 《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)

    // 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请 ...

  10. js 数组 添加或删除 元素 splice 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 filter

    里面可以用 箭头函数 splice         删除 增加 数组 中元素 操作数组 filter 创建新数组  检查指定数组中符合条件的所有元素

随机推荐

  1. No valid Maven installation found. Either set the home directory in the configuration dialog or set

    原因: IDEA的maven地址设置出错,系统找不到指定的maven路径 解决: setting---->maven修改正确的maven链接地址. 设置你maven 的地址为你的存放路基就好了

  2. Js基础知识(四) - js运行原理与机制

    js运行机制 本章了解一下js的运行原理,了解了js的运行原理才能写出更优美的代码,提高运行效率,还能解决开发中遇到的不理解的问题. 进程与线程 进程是cpu资源分配的最小单位,进程可以包含多个线程. ...

  3. swoole table

    swoole_table #在内存中建立一张表,用来存放进程交互过程中使用的数据,与memocache似有异曲同工之妙#用法 <?php$table = new swoole_table(204 ...

  4. [Git] How to revert one file changes from one commit

    Many times we might changed one file which we don't intent to do... but it was too late, until we fo ...

  5. 题解 【BZOJ4700】适者

    题面 解析 看了好多dalao们的题解,然而还是不明白... 于是在想了半天后,决定自己写一篇题解. step 1 首先,分析题意, 应该还是比较容易想到, 要一直攻击一个兵器, 直到破坏它为止. 因 ...

  6. Mysql入门-对表数据的增删改查

    这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mysql的时候, ...

  7. Jmeter接口测试之用例数据分离

    之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...

  8. [Linux]ubuntu16.04 nginx彻底删除与重新安装

    nginx彻底删除与重新安装 查看nginx正在运行的进程,如果有就kill掉 sudo netstat -ntlp | grep nginx sudo kill -9 进程id 删除nginx,pu ...

  9. tomcat使用jdbc连接mysql出现的错误

    出现的错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 前提: 已经在工程的build path中添加了驱动包(mysql-conn ...

  10. android自定义键盘(解决弹出提示的字体颜色问题)

    最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置.力度.指尖接触屏幕的面积等参数. 在写自定义键盘的时候,用到了国内网上的一些代码,出处是 向先人致敬! ...