C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针
指针是一个变量,其值为另一个变量的地址。
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。
下面从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):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针的更多相关文章
- 剑指Offer 28. 数组中出现次数超过一半的数字 (数组)
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- C#基础知识汇总(不断更新中)
------------------------------目录---------------------------- 1.隐式类型2.匿名类型3.自动属性4.初始化器5.委托6.泛型7.泛型委托8 ...
- Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
1. 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...
- Java基础知识强化21:Java中length、length()、size()区别
1.java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.2.java中的length()方法是针对字符串String说的,如果想看这个 ...
- [饭后算法系列] 数组中"和非负"的最长子数组
1. 问题 给定一列数字数组 a[n], 求这个数组中最长的 "和>=0" 的子数组. (注: "子数组"表示下标必须是连续的. 另一个概念"子 ...
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- 4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II
第一次做到数组双指针的题目是80: 因为python的List是可以用以下代码来删除元素的: del List[index] 所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下: n = ...
- 《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)
// 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请 ...
- js 数组 添加或删除 元素 splice 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 filter
里面可以用 箭头函数 splice 删除 增加 数组 中元素 操作数组 filter 创建新数组 检查指定数组中符合条件的所有元素
随机推荐
- CF #546 D.E
D coun[i]表示[i]这个数右边有多少个数j能和他组成题中所给的二元组(i,j) 如果一个数的coun[i]=n-i-ans 那么说明他可以与最后一个交换 同时不计算贡献 因为它是向右走的 对左 ...
- wget 小技巧
一,案例 wget, 一个强大的下载命令.下载文件如果由于中途因本地网络问题断开了,没下载完,重新运行了一下WGET命令,会发现完全在重新下载了,新文件名字会在后面加个1..... 这是wget下载失 ...
- Myeclipse中左边的项目目录没了
切换一下Perspective, java, resource都有项目窗口 具体的 Window->Open Perspective 如果项目窗口被关了的话 windows->show v ...
- li元素之间产生间隔
是因为li标签换行导致的 简单的解决办法是将所有的li标签写到一行(不过实际上一般不会这样做) 或者把ul设置font-size为0,但这样ul中的文字就会消失,所以要记得单独给子元素设置font-s ...
- PassengerNginxdebian快速部署Rails
Passenger/Nginx/Debian快速部署Rails PassengerNginxdebian快速部署Rails 安装所需的linux包 sudo apt-get install ...
- puppet完全攻略(二)让puppet代码支持vim高亮显示
puppet完全攻略(二)让puppet代码支持vim高亮显示 2012-06-10 13:33:01 标签:puppet viong puppet完全攻略 原创作品,允许转载,转载时请务必以超链接形 ...
- 【Wince-自定义控件】ImageButton 带图片、文字
1.看图 可以实现MouseDown改变背景颜色或背景图片. 遗憾是没有实现键盘触发按钮事件. 2.选择继承自Control基类 public class ImageButton : Control ...
- 【leetcode】1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix
题目如下: Given a m x n binary matrix mat. In one step, you can choose one cell and flip it and all the ...
- java+文件批量下载
这篇文章主要介绍了Java实现批量下载选中文件功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 1.在action中定义变量 private List<String> downLoa ...
- python socket.io 坑。
python下star最高的是https://github.com/miguelgrinberg/python-socketio 是flask作者写的.client server都有了,而且还提供了a ...