ios学习之旅---指针也不难

1、认识指针
#include <stdio.h>
//基本数据类型作为函数參数传递是值传递
//void moveFront(int x ,int y)
//{
//    x  = x + 2;
//}
void test()
{//  确定当前坐标int x = 20;int y = 150;printf("%p\n",&x);printf("%lu\n",&x);*((int *)(0x7fff5fbff76c)) = 22;printf("(%d,%d)\n",x,y);//    moveFront(x, y);//    printf("(%d,%d)\n",x,y);}//假设你想訪问指针所指向存储空间,就必须使用訪问指针所指向的存储空间的操作符
void moveFront(int *x ,int *y)
{
//  x  = x + 2;//此时是改变指针的指向,而不是訪问指针所指向的存储空间*x  = *x + 2;
}int main(int argc, const char * argv[]) {//  确定当前坐标int x = 20;int y = 150;printf("(%d,%d)\n",x,y);moveFront(&x, &y);printf("(%d,%d)\n",x,y);return 0;
}


2、指针的定义与初始化(重点掌握)


   内存中最小的存储单元:字节。每个字节在内存中都有一个编号,这编号就是指针
 
  指针:内存地址
  有了指针你就有了打开这块内存钥匙,就能够操作这一块内存
 
  指针变量:存放内存地址的变量
  定义指针:指针所指向数据类型  * 指针变量名称;
 在的定义变量时候,*是一个类型说明符,说明定义这个变量是一个指针变量
  在不是定义的变量的时候。*是一个操作符。訪问(读、写)指针所指向的那块存储空
    指针的初始化:
  
    注意点:
    1、仅仅有定义没有初始化指针里面是一个垃圾值。这时候我们成为这个指针为野指针
    2、假设操作一个野指针
       2.1 程序崩溃
       2.2 訪问不该你訪问存储。操作潜在逻辑错误
    3、不能够使用整形常量赋值一个指针变量
       由于内存是操作系统分配我们的,不是我们随便取的
    4、什么类型的指针。仅仅指向什么类型的变量
    5、多个指针能够指向同一变量
    6、指针的指向是能够改变的


#include <stdio.h>//指针的定义
void test()
{int num = 10;//  定义一个指针变量int *p;p = #*p = 20;printf("num = %d\n",num);
}int main(int argc, const char * argv[]) {// 先定义在进行初始化int num = 10;
//  定义一个指针变量pint * p;//    *p = # // p 还有进行初始。不可以訪问它所指向存储空间p = #//p 指向 num*p = 20;//  定义指针变量的同一时候进行初始int num2 = 20;int *p2 = &num2;*p2 = 40;printf("%d,%d\n",num2,*p2);// 不可以使用整形常量赋值一个指针变量
// 由于内存是操作系统分配我们的,不是我们随便取的//    int *p3 = 100000;//此处是错误的
//    
//    *p3 = 10;p2 = #printf("%p\n",p2);char c = 'a';int *pc = &c;*pc = 10;printf("%p\n",p2);return 0;
}

3、多级指针


通过指针訪问变量称为间接訪问。

因为指针变量直接指向变量,所以称为“一级指针”。而
假设通过指向指针的指针变量来訪问变量则构成“二级指针”。


#include <stdio.h>void test()
{int num = 10;int *p = #//  定义一个指针来指向变量p//  pp就是一个二级指针int **pp = &p;**pp = 30;printf("%d\n",num);int ***ppp = &pp;***ppp = 50;printf("%d\n",num);//  四级指针int ****pppp = &ppp;****pppp = 100;printf("%d\n",num);   
}
void readFile(char **error)
{*error = "读取错误";   
}int main(int argc, const char * argv[]) {//    char error[100];char *error;readFile(&error);printf("%s",error);return 0;
}

4、指针为什么要区分类型

   1、变量的地址是变量所在占存储空间的首地址
   2、指针变量只能够存储一个地址编号,假设没有类型。当通过指针就不知道要訪问多少个字节的存储空间
   3、指针区分类型是为了在通过指针訪问它所指向的存储空间的时候,可以正确訪问
   4、假设通过一个char类型的指针操作一个int的变量。假设值的二进制数据超过1字节,那么就造成数据错误
   5、假设通过一个int 类型的指针操作一个char变量,那么你就会改动了你不该改动的内存,造成程序逻辑错误
#include <stdio.h>
/*全部指针类型都是占用八个字节的存储空间*/
void testEveryPointerIs8B()
{printf("%lu\n",sizeof(int *));printf("%lu\n",sizeof(char *));printf("%lu\n",sizeof(double *));printf("%lu\n",sizeof(float *));printf("%lu\n",sizeof(float **));
}int main(int argc, const char * argv[]) {int num = 10;char *cp = #printf("%d\n",num);return 0;
}

5、指针运算概述
   指针变量:存放是内存字节的地址编号(无符号的整形数)
   指针:是运算受限的无符号的整形数
   运算运算:
   指针 + 整形数 === 指针变量中值 + sizeof(其所指向数据类型)
   指针 - 整数数 === 指针变量中值 - sizeof(其所指向数据类型)
   pointer1 - pointer2 = (pointer1中值 - pointer2中值) / sizeof(其指向数据类型) 
   赋值运算:
    =
    += 必须是一个整形数
    -= 必须是一个整形数
   比較运算
   ==
   != 
   >
   < 
   >=
   <=
   自增自减
   p++; p = p + 1;
   ++p; p = p + 1;
   --p;
   p--;
 
#include <stdio.h>//算术运算
void test()
{int a = 10;int *p = &a;//  指针+1p = p + 1;int nums[5] = {1,2,3,4,5};int * pointer1 = nums;int * pointer2 = &nums[4];size_t size  = pointer2 - pointer1;    printf("%lu\n",size);        //  pointer1 + pointer2;//    pointer2 * pointer1;//    pointer1 / pointer2;//    pointer1 / 2;
}
//赋值运算
void test1()
{int a = 10;//    int *p = &a;int nums[] = {1,2,3,4,5};int *p = nums;int *p2 = nums;p += 2;p = p + 2;p -= 1;printf("%d\n",*p);   
}//关系运算
int main(int argc, const char * argv[]) {int nums[] = {1,2,3,4,5};int *p = nums;p++;int result =  nums == p;result = p > nums;p--;result = p < nums;   result = p >= nums;result = p <= nums;   printf("%d\n",result);   return 0;
}
6、指针与一维数组(理解)

 数组像一个指针:訪问数组中元素,使用数组与使用指向这个数组的指针是等价
 
 nums[1] ==== p[1]
 nums+1  ==== p + 1;
 
 nums[1] 的本质 *(nums + 1)
 指针 + 整数 =====  指针中的值 + sizeof(所指向的数据类型) * 整数
//    int nums[] = {1,2,3,4,5};
//
//    int *p = nums;
double nums[] = {1.0,2.0,3,4,5};
double * p = nums;
//    printf("%d,%d,%d,%d,%d,%d\n",nums[1],p[1],*(nums + 1),*(p + 1),*(++p),。

);
printf("%p\n",nums);
printf("%p\n",nums+2);
printf("%p\n",p);
printf("%p\n",p+2);
  数组不是一个指针
   1、sizeof(array) != sizeof(pointer):当一个数组赋值一个指针变量的时候,那么数组中有些信息就丢失了,比方数组长度,这样的现象指针信息遗失
   2、指针的指向是能够改变的,数组的指向是不能够改变
   3、array == &array 数组名就是数组地址,pointer != &pointer : 指针所指向地址不是指针本身地址

#include <stdio.h>
int main(int argc, const char * argv[]) {int nums[] = {1,2,3,4,5};int *p = nums;p = nums;
//    nums = nums + 1;    printf("%lu,%lu\n",sizeof(nums),sizeof(p));       printf("%p\n",nums);printf("%p\n",&nums);      printf("%p\n",p);printf("%p\n",&p);        return 0;
}

7、指针与二维数组
指针数组与二维数组指针变量的差别
应该注意指针数组和二维数组指针变量的差别。这两者尽管都可用来表示二维数组,可是其表示方法和意义是
不同的。
二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少。而指针数组类型表示的
是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号。

比如:
int (*p)[3];
表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。


int *p[3]
表示p是一个指针数组,有三个下标变量p[0]。p[1],p[2]均为指针变量。

#include <stdio.h>void test()
{int nums[3][2] = {{1,2},{3,4},{5,6}};   int *p = nums[0];    printf("%p\n",p);printf("%p\n",nums);    for (int i = 1; i < 6; i++) {printf("%d ",*(p + i));}}
/*定义指针数组的格式:数据类型 * 指针变量名称[指针个数]*/
void test2()
{int nums[3][2] = {{1,2},{3,4},{5,6}};//    int * p[2] = {nums[0],nums[1]};//        p = nums;////    printf("%d\n",p[0][1]);int a = 10;int b = 20;int c = 30;int *p = &a;//    *p === p[1]; 没有这么写的int *ps[3] = {&a,&b,&c};printf("%d,%d,%d",*ps[0],*ps[1],*ps[2]);}
/*定义一个指向一维数组的指针数据类型 (*指针名称)[所指向的一维数组的元素个数]指针 + 整数 === 指针中的值 + 所指向数据类型的长度 * 整数*/int main(int argc, const char * argv[]) {int nums[3][2] = {{1,2},{3,4},{5,6}};int (*ps)[2];ps = nums;//能够觉得ps 与 nums是等价的 int num = ps[0][1];printf("%d\n",num);   printf("%p\n",nums);printf("%p\n",nums+1);    printf("%p\n",ps);printf("%p\n",ps+1);    for (int i =0 ; i < 3; i++) {for (int j = 0; j < 2 ; j++) {printf("%d ",ps[i][j]);}printf("\n");}//    nums   nums[0]//    同样点:相应地址都是一样的
//    不同点:指针类型是不同
//    nums + 1 = nums + sizeof(nums[0])
//    nums[0] + 1 = nums + sizeof(int)//   sizeof(nums) 二维数组所用占用存储空间字节数
//   sizeof(nums) / sizeof(int) 二维数组中一共同拥有多少个int的数据int *p = nums[0];for (int i = 0; i < sizeof(nums) / sizeof(int); i++) {printf("%d ",p[i]);}return 0;
}


转载于:https://www.cnblogs.com/blfbuaa/p/6905697.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

符合skyline的3dml网络发布服务

技术交流群&#xff1a;665060698使用java web实现&#xff1b;接口符合skyline的3dml模型形式&#xff1b;通过简单的发布界面&#xff0c;直接发布3dml模型&#xff1b;实现te pro在客户端读取数据&#xff1b;实现在te pro客户端的对应查询功能&#xff1b;负载可以达到skyl…

51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!

题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId1125 1125 交换机器的最小代价基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 80 难度&#xff1a;5级算法题收藏关注有N台机器重量各不相等&#xff0c;现在要求把这些机器按照…

《Python从小白到大牛》简介

《Python从小白到大牛》已经上市&#xff01; 本书是一部系统论述Python编程语言、OOP编程思想以及函数式编程思想的立体化教程&#xff08;含纸质图书、电子书、教学课件、源代码与视频教程&#xff09;。为便于读者高效学习&#xff0c;快速掌握Python编程方法。本书作者精心…

webpack学习

全局安装安装webapck npm i webpack -g 现在我们就可以全局的使用webpack命令了 webpack中基础的命令&#xff1a; webpack enter.js output.js --watch 这个命令是将enter.js打包成output.js&#xff0c;然后html只需要引用该文件就可以了看如下entry.js,这是简单的js代码。 /…

从ORA-27300,ORA-27301到ORA-00064

近期因为session数量添加&#xff0c;须要调整session&#xff0c;也就是要调整process參数。看是比較简单的一个问题&#xff0c;却遭遇了ORA-27300&#xff0c;ORA-27301。因为这个涉及到了有关内核參数kernel.sem的改动。以下是其详细描写叙述。1、故障现象OS版本号&#xf…

Halcon|读取3D相机点云数据

Halcon|读取3D相机点云数据 最近发现很多小伙伴在使用Halcon处理3D工业相机扫描结果的时候遇到了“如何读取”的问题。一般的3D工业相机储存数据的格式有txt格式、tif格式、csv格式、ply格式、ptx格式、bin格式、obj格式等。 txt格式 读取txt文件生成3D模型一般需要分析txt文件…

药片粘连物体的分割

药片粘连物体的分割要求&#xff1a;图片&#xff1a;处理程序&#xff1a;处理结果&#xff1a;要求&#xff1a; 将药片分割&#xff0c;统计药片数量。不能使用模板匹配。 图片&#xff1a; 先看一下要处理的原图&#xff1a; 处理程序&#xff1a; read_image (Image…

BZOJ 1026 [SCOI2009]windy数

1026: [SCOI2009]windy数 Description windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道&#xff0c;在A和B之间&#xff0c;包括A和B&#xff0c;总共有多少个windy数&#xff1f; Input 包含两个整数&#xff0c;A B。 Outp…

不连续区域的拟合

如下图&#xff0c;需要把图中4个半圆分别连接起来 我试过closing 和 dilation&#xff0c;下图中后三个还可以连接起来&#xff0c; 但是第一个因为不连续地方较长&#xff0c;如果增大closing的值&#xff0c;会导致其它点 出现过度畸形。 有没有能连接相邻选区的方法&#…

SPSS输出的结果都要写到文章中吗

SPSS输出的结果都要写到文章中吗 经常有人问到&#xff0c;SPSS输出的结果都要写到文章中吗&#xff1f;文章中应该写什么呢&#xff1f;比如&#xff0c;均值、中位数、众数、标准差、百分位数、最小值、最大值等等&#xff0c;都要出现在文章中吗&#xff1f;洋洋洒洒那么多&…

php Closure 类型

2019独角兽企业重金招聘Python工程师标准>>> <?php /*** Closure 理解* 匿名函数&#xff08;Anonymous functions&#xff09;&#xff0c;* 也叫闭包函数&#xff08;closures&#xff09;* Closure 是匿名函数的php中的称呼*/// 创建一个Closure$func funct…

ftk学习记(label篇)

【 声明&#xff1a;版权全部&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】还是接着上面的一篇博文。之前以前答应过大家&#xff0c;让大家看一下最简单的ftk程序是怎么执行的。所以&#xff0c;这里我们上传一下图片。由于…

扇形特征点提取

处理要求 分别找出扇形左上角&#xff0c;左下角&#xff0c;右上角&#xff0c;右下角&#xff0c;最高点&#xff0c;下面弓形最高点 原图 halcon 处理程序 read_image (Image14208259e49d7b1cf7c544, 544.bmp) rgb1_to_gray (Image14208259e49d7b1cf7c544, GrayImage) t…

Android Studio maven-metadata.xml 卡着不动原因和解决方法

头一天好好的&#xff0c;第二天就卡着了。 一直在这个地方不动&#xff0c;如果停止就会报 Error:Could not run build action using Gradle distribution ‘https://services.gradle.org/distributions/gradle-4.1-all.zip‘. 所以直接就去看了下链接&#xff1a;https://dl.…

halcon 圆环类缺陷检测的一种方法(极坐标变换法)

目录简介极坐标变换定义原理Halcon中的极坐标变换1、polar_trans_image_ext算子用法与参数剖析2、polar_trans_region_inv算子用法与参数剖析圆环类缺陷检测思路与步骤Halcon实例实例简介程序解读思路剖析应用实例1项目介绍处理程序处理效果应用实例2项目介绍处理程序处理效果简…

Halcon图像滤波方法与原理概述

目录简介Halcon算子与算法原理基础滤波a、均值滤波b、中值滤波c、高斯滤波d、导向滤波简介 图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和…

Halcon深度学习环境搭建(win下)全网最全教程

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/cashmood/article/details/105042928 文章目录halcon深度学习介绍系统与环境搭建1、对电脑系统与硬件…

第二周进度及工作量统计

项目&#xff1a;词频统计修改 项目类型&#xff1a;个人项目 项目完成情况&#xff1a;已完成 项目改进&#xff1a;第二次改进 项目日期&#xff1a;2016.9.14----2.16.9.14 CCSEIT分析需求&#xff0c;设计15:2015:30010编码实现15:3016:20050文档程序说明&#xff0c;随笔2…

Dalsa线扫相机SDK开发-小试牛刀(1)

拿到了dalsa相机&#xff0c;可以用Sapera软件配置相机&#xff0c;进行图像采集。但是自己开发的话就得撸起袖子写代码了&#xff0c;查了两篇不错的博文&#xff0c;作为指导。 Sapera帮助文档 - 《好好先生》专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liubing8609/a…

深度学习环境搭建(GPU)CUDA安装(完全版)

文章目录1、查询电脑硬件2、环境搭建与软件安装1、安装CUDA运算平台软件2、安装cuDNN支持包3、配置环境变量3、验证CUDA与cuDNN安装前几天在看深度学习。因为对深度学习不是很了解&#xff0c;在配置环境时走了许多弯路&#xff0c;也总是战战兢兢的。现在对深度学习的环境搭建…