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

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

下面从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. AIX文件系统/var空间100%的问题

    一.问题说明/var/spool/mqueue目录下出现了多个df打头的文件,导致/var空间最终100% EBANK_P570_MAIN/var/spool/mqueue#ls -l total 8 ...

  2. 题解 【SCOI2015】小凸玩矩阵

    题面 解析 这题其实也是网络流建图.. 首先,转换下思路, 求第k大的数的最小值, 其实就是求一个最小的值, 使选取的点中能有(n-k+1)个的值比它小. 因此,可以采用二分答案, 每次判断一个值, ...

  3. 使用nodejs进行开发,concurrently模块,使我们同时执行多个命令。

    concurrently模块使用. 安装模块 npm install concurrently 配置concurrently 运行多个服务 当我们使用nodejs和vue混合开发的时候.当要同时启动后 ...

  4. Git 如何针对项目修改本地提交提交人的信息

    Git 如果不进行修改的话,在默认情况下将会使用全局的用户名称和电子邮件. 但是在 GitHub 中是通过用户邮件来进行提交人匹配的. 如何针对项目来修改提交的用户信息? 针对 TortoiseGit ...

  5. python测试网站访问速度

    # -*- coding: utf-8 -*- # @Author : Felix Wang # @time : 2018/8/13 22:13 # pip3 install pycurl impor ...

  6. 【CUDA 基础】2.4 设备信息

    title: [CUDA 基础]2.4 设备信息 categories: CUDA Freshman tags: CUDA Device Information toc: true date: 201 ...

  7. Hibernate和Mybatis框架的对比

    Hibernate:是一个标准的ORM(对象关系映射)框架.入门门槛较高,不需要程序员写sql,sql语句自动生成.但是就造成对sql语句进行优化.修改比较困难.应用场景:适用于需求变化不多的中小型项 ...

  8. Multi-judge Solving

    C. Multi-judge Solving 写这个题的时候也是思维出了漏洞....容易漏掉的一点就是在别的 oj 上做了题之后可能不能够马上回原来的 oj 上做题,这是写循环的时候需要注意的的方,需 ...

  9. Java基础__Integer类型中的自动装箱

    Integer类型的自动装箱:就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. ...

  10. LeetCode---Backtracking && DP

    **322. Coin Change 思路:动态规划,构造一个数组,存入当前index最少需要多少个coin public int coinChange(int[] coins, int amount ...