ios学习之旅---指针也不难
2、指針的定義與初始化(重點掌握)
? ?內存中最小的存儲單元:字節。每個字節在內存中都有一個編號,這編號就是指針
?
? 指針:內存地址
? 有了指針你就有了打開這塊內存鑰匙,就能夠操作這一塊內存
?
? 指針變量:存放內存地址的變量
? 定義指針:指針所指向數據類型 ?* 指針變量名稱;
?在的定義變量時候,*是一個類型說明符,說明定義這個變量是一個指針變量
? 在不是定義的變量的時候。*是一個操作符。訪問(讀、寫)指針所指向的那塊存儲空
? ? 指針的初始化:
??
? ? 注意點:
? ? 1、僅僅有定義沒有初始化指針里面是一個垃圾值。這時候我們成為這個指針為野指針
? ? 2、假設操作一個野指針
? ? ? ?2.1 程序崩潰
? ? ? ?2.2 訪問不該你訪問存儲。操作潛在邏輯錯誤
? ? 3、不能夠使用整形常量賦值一個指針變量
? ? ? ?由于內存是操作系統分配我們的,不是我們隨便取的
? ? 4、什么類型的指針。僅僅指向什么類型的變量
? ? 5、多個指針能夠指向同一變量
? ? 6、指針的指向是能夠改變的
3、多級指針
通過指針訪問變量稱為間接訪問。
因為指針變量直接指向變量,所以稱為“一級指針”。而
假設通過指向指針的指針變量來訪問變量則構成“二級指針”。
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 : 指針所指向地址不是指針本身地址
7、指針與二維數組
指針數組與二維數組指針變量的差別
應該注意指針數組和二維數組指針變量的差別。這兩者盡管都可用來表示二維數組,可是其表示方法和意義是
不同的。
二維數組指針變量是單個的變量,其一般形式中"(*指針變量名)"兩邊的括號不可少。而指針數組類型表示的
是多個指針(一組有序指針)在一般形式中"*指針數組名"兩邊不能有括號。
比如:
int (*p)[3];
表示一個指向二維數組的指針變量。該二維數組的列數為3或分解為一維數組的長度為3。
int *p[3]
表示p是一個指針數組,有三個下標變量p[0]。p[1],p[2]均為指針變量。
轉載于:https://www.cnblogs.com/blfbuaa/p/6905697.html
總結
以上是生活随笔為你收集整理的ios学习之旅---指针也不难的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米MIX Fold 2外观正式公布:徕
- 下一篇: Win11 2023新预览版25179发