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.pswp.cn/news/254487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFmpeg中MPEG-4編碼程序追蹤,其他FFMPEG自帶編碼器同理

FFmpeg中與MPEG-4編碼相關的主要文件有mpegvideo.c&#xff0c;h263.c等。在mpegvideo.c中&#xff0c; AVCodec mpeg4_encoder { "mpeg4", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4, sizeof(MpegEncContext), MPV_encode_init, MPV_encode_picture, …

符合skyline的3dml網絡發布服務

技術交流群&#xff1a;665060698使用java web實現&#xff1b;接口符合skyline的3dml模型形式&#xff1b;通過簡單的發布界面&#xff0c;直接發布3dml模型&#xff1b;實現te pro在客戶端讀取數據&#xff1b;實現在te pro客戶端的對應查詢功能&#xff1b;負載可以達到skyl…

Texture Inspection 紋理檢驗halcon算子,持續更新

目錄deviation_imageentropy_imagetexture_lawsdeviation_image 功能&#xff1a;計算矩形窗口內的灰度值的標準偏差。 entropy_image 功能&#xff1a;計算矩形窗口內的灰度值的平均信息量。 texture_laws 功能&#xff1a;使用一個Laws文本濾波器&#xff08;地質變形&a…

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編程方法。本書作者精心…

c語言基礎知識_結構體訪問,共同體,枚舉類型

C語言結構體變量的引用&#xff1a;對于定義的結構體類型的普通變量&#xff0c;訪問其成員用圓點運算符&#xff08;“.”&#xff09;&#xff0c;標準訪問方式如下&#xff1a;   結構體變量名.成員名   對于定義為指向結構體的指針變量&#xff0c;用箭頭運算符&#x…

Wiener Filter維納濾波器halcon算子,持續更新

目錄gen_psf_defocusgen_psf_motionsimulate_defocussimulate_motionwiener_filterwiener_filter_nigen_psf_defocus 功能&#xff1a;產生一個均勻散焦模糊的脈沖相應。 gen_psf_motion 功能&#xff1a;產生一個&#xff08;線性&#xff09;運動模糊的脈沖相應。 simula…

【轉載】數據庫操作:添加、插入、更新語句

原始日期&#xff1a; 2016-07-22 12:03 SQL常用命令使用方法&#xff1a;(1) 數據記錄篩選&#xff1a;sql"select * from 數據表 where 字段名字段值 order by 字段名 [desc]"sql"select * from 數據表 where 字段名 like %字段值% order by 字段名 [desc]&qu…

webpack學習

全局安裝安裝webapck npm i webpack -g 現在我們就可以全局的使用webpack命令了 webpack中基礎的命令&#xff1a; webpack enter.js output.js --watch 這個命令是將enter.js打包成output.js&#xff0c;然后html只需要引用該文件就可以了看如下entry.js,這是簡單的js代碼。 /…

3D 相機halcon算子,持續更新

目錄add_scene_3d_cameraadd_scene_3d_instanceadd_scene_3d_labeladd_scene_3d_lightclear_scene_3dcreate_scene_3ddisplay_scene_3dget_display_scene_3d_inforemove_scene_3d_cameraremove_scene_3d_instanceremove_scene_3d_labelremove_scene_3d_lightrender_scene_3dset…

Selenium 中文API

Selenium 中文API 轉自&#xff1a;http://blog.csdn.net/lh9529/article/details/3946567 概念 Selenium 通過命令進行驅動。Selenium 可歸納為三種“風格”&#xff1a;動作、輔助和斷言。每一個命令調用就是下表中的一行。 命令 目標 值 動作(Actions)命令一般用于操作應用…

C# 特性(Attribute)

個人定義&#xff1a;不侵入對象的情況下&#xff0c;添加對象附注信息。 官方定義&#xff1a;將預定義的系統信息或用戶定義的自定義信息與目標元素相關聯。目標元素可以是程序集、類、構造函數、委托、枚舉、事件、字段、接口、方法、可移植可執行文件模 塊、參數、屬性 (…

收集js庫的網站

https://www.javascripting.com/view/redux

c語言中有關void,sizeof,結構體的一些問題

void[1]&#xff1a;void是C語言中的空類型&#xff0c;void的用途有二。 1、對函數返回的限定&#xff1b; 如果函數沒有返回值&#xff0c;則默認返回整數類型&#xff0c;而不是void類型。c有很嚴格的類型&#xff0c;不允許函數不加類型聲明&#xff0c;而編譯器則不這么認…

Drawing繪圖halcon算子,持續更新

目錄drag_region1drag_region2drag_region3draw_circledraw_circle_moddraw_ellipsedraw_ellipse_mod_draw_linedraw_line_moddraw_nurbsdraw_nurbs_interpdraw_nurbs_interp_moddraw_nurbs_moddraw_pointdraw_point_moddraw_polygondraw_rectangle1draw_rectangle1_moddraw_re…

搞明白這八個問題,Linux系統就好學多了

正在猶豫入坑Linux學習的同學或者已經入坑的同學&#xff0c;經常會問到這樣八個問題。今天&#xff0c;這些問題我都會一一解答&#xff0c;希望我的看法能幫助各位同學。常言道“好的開始是成功的一半”&#xff0c;如果你明白了以下八個問題&#xff0c;就能有一個很好的開始…

從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文件…

FFMPEG解碼流程

1. 注冊所有容器格式和CODEC: av_register_all() 2. 打開文件: av_open_input_file() 3. 從文件中提取流信息: av_find_stream_info() 4. 窮舉所有的流&#xff0c;查找其中種類為CODEC_TYPE_VIDEO 5. 查找對應的解碼器: avcodec_find_decoder() 6. 打開編解碼器: avcodec_open…

linux用戶登錄指定目錄

一、創建用戶和用戶組 [rootweb4 lianyu]# groupadd lianyu [rootweb4 lianyu]# useradd lianyu -g lianyu [rootweb4 lianyu]# passwd lianyu二、用戶登錄指定目錄 [rootweb4 lianyu]# cd /home/lianyu [rootweb4 lianyu]# ls -a . .. .bash_history .bash_logout .bas…