C語言之指針與數組總結

和指針相關的問題口訣1

1. 地址變量得地址,得誰地址指向誰

和指針相關的問題要畫圖: 內容變量畫房子,指針畫箭頭

---->口

----------------------------------------------------

和指針相關的兩個特殊運算符:

一、"&" 取地址運算符,通過&運算符可以取出普通變量的地址;

二、"*"? 有兩種意義:

?? 1.? 為指針標志: 是否為指針標志主要看前面是否有類型,此處有一個int

?? 2.? 為指針運算符:

  ? ?在等號右面為取值。*可以取出指針變量所指向的普通變量的值。

 ?   在等號左面為賦值。*可以將指針變量所指向的普通變量的值,修改為其他。

? ? ? ? 口訣2有* 為內容值,不是讀就是寫。等號左面為賦值, 其余都為取值。

? ?3.? 為乘法運算符。當且僅當左右的都為變量時。略。

int a, b =20, c=30, d=40, *p; (正確,此處的*為指針標志,只起到定義的左右,沒有取值和賦值的作用。是否為指針標志主要看前面是否有類型,此處最前面有一個int)

p=&d; (正確,p指向d的地址)

a=*p;? (正確,此處的*為取值。最后結果a的值變為了d的值40)

*p =c; (正確,此處的*為賦值。最后結果d的值變為了C的值30)

*p =&b; (運行錯誤,左邊為內容值,右邊為地址,不等價)

--------------------------------------------------------

和指針相關的等價表達式

若指針變量p指向變量a,即將變量a的地址賦給了指針變量p.

如:int a=20, int *p=&a;

則有如下結果:

A、*p <=> a

B、 p <=> &a

C、 &*p <=> &a <=> p

D、*&a <=> *p <=> a

E、 (*p)++? a++?

???? (*p)--? a-- ???

???? ++(*p)? ++a?? ++*p ??

??? ? --(*p)? --a?? --*p

可以看出 * 和 & 是互逆的兩個運算符

--------------------------------------------------------

所有的指針變量在內存中分配的字節數相同 sizeof(指針) 永遠是 兩個字節, 不管指針定義時是 int *, float * 還是 double * . 詳細如下

int *p1; ? 則 p1以后必須指向int 類型的變量。 ? 但指針本身的長度,sizeof(p1) 為2個字節(2*8bit -16bit)

float *p2; ? 則 p2以后必須指向float?類型的變量。 ? 但指針本身的長度,sizeof(p2) 為2個字節(2*8bit -16bit)

double *p3; ? 則 p3以后必須指向double?類型的變量。 ? 但指針本身的長度,sizeof(p3) 為2個字節(2*8bit -16bit)

-----------------------------------------------------------

四道例題:

例子1.

void fun (int *x , int *y) {
  printf("%d, %d", *x, *y) ;
  *x = 3;
  *y = 4;
}

main()
{
int x = 1, y = 2
fun(&y, &x);
printf("%d, %d", x, y);
}


結果
2, 1
4, 3

注意main在調用fun函數時, y 和x故意寫顛倒了。

?--------------------------------------------------------------

例子2.?

#include <stdio.h>
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

如果在控制臺輸入??2 和 5

則輸出結果為?

5, 2

原因: 在調用swap函數時使用了職稱,所以在swap函數內部對p1,p2 所引用的內容值的修改,會影響外面的a和b的值。

?--------------------------------------------------------------

例子3:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2不同, swap函數中的temp為指針,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.

但最后的打印結果仍為
2,5


原因是:雖然main中調用swap函數時使用了指針傳遞,但swap函數中的所有操作都是:將指針本身的修改,而沒有再次使用*操作符來修改“指針指向的內容值”

口訣3:沒有*的指針操作為地址,地址的賦值意味著改指向。

---------------------------------------------------------------------

例子4:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2很像。但唯一不同是,temp定義為指針而不是普通變量。看上去似乎應該和2的輸出結果一樣,仍為
2,5 。

但實際運行時編譯器會報錯:非法的內存寫入。

原因是:temp為野指針,并沒有預訂指向哪里。如果指向系統區,則可能導致操作系統死機或崩潰。

如果temp在定義后,馬上給一個初始值,就不會有問題了。

?---------------------------------------------------------------------

指針、數組的等價符號

若將數組作為形參,則將數組名作為指針變量來處理。

int fun(int a[10]) <=> int fun(int *a) <=> int fun(int a[])

可以看出,口訣4: ?&與*互逆。 *與[]等價, &與[]互逆

?

例子5:

int s[10], a, b;
in d[3][6];

?

int *p;
p=&a; //p 指向了整數a
p = &s[2]; //p指向了s數組的第二個元素
p= &d[2][4];p指向了d數組的第二行、第四列的元素。

所以,以上的語句都是對的。

?

上面的例子:

1. 定義了一個int s[10]; ? 則 s等同于 &s[0]. ? 即,看到一個數組,就馬上聯想到他代表的是數組第一個元素的地址。

? ??在C語言中規定,數據名代表數組的首地址,并且是一個地址常量

2. 另外,如果定義了一個指針 int *ppp = s; ?則 ? ppp?定價于s, ?同時等價于?&s[0]。

?---------------------------------------------------------------------

指針的加減:


當指針變量指向數組中的某一個地址時,指針變量加1后指向數組的下一個元素,
指針變量減1時指向數組的前一個元素。

?例子6:

?

float a[10]; float *p;
p=&a[4]; 則p-3指向?

先畫圖:

a[0] |?a[1] |?a[2] |?a[3] |?a[4] | ...

p的初始位置指向了 a[4], ?則?p-3 為向前3個,指向了 a[1]

?口訣5: ?指針的加減是向前或向后移動了n個元素

?---------------------------------------------------------------------

int a[N], *p=a;

則有:

地址三等價:

存在等價表達式:

p+i <=> a+i <=> &a[i] ?代表的是第i個元素的地址

元素四等價:

存在等價表達式:

1. ? *(p+i)?<=> *(a+i)?<=> a[i] ? 代表的是第i個元素的值

2. ?另外,還有 p[i]?<=>?a[i] 。?p[i] 的用法不多見,但無任何錯誤,代表的也是第i個元素的值。原因是p和a完全等價。

整理出來的等價式如下:

a) *(p+i) <=> *(a+i) <=> a[i] <=> p[i]
b) p++ <=>?++p <=>? p+=1 <=>? p=p+1
c) p-- <=>??--p ?<=>? p-=1 ?<=>? p=p-1
d) *p++ ?<=>? ?*(p++)
? ?說明:* 與 ++ 的運算優先級一樣,所以按照從右到左的結合原則,先執行++,后執行*
? ?++在p的后面,為執行后再加。即先把p的值取出,指針再加1.
e) *++p ?<=>? *(++p)
? ? ++在p的前面,為先加再執行。即先把指針加1, 再把移動后的p所指向的值取出,
f) (*p)++ <=>?? ++(*p) ?<=>?? ++*p
? ? 將p的內容自增
g) (*p)-- ?<=>??--(*p) ?<=>?? --*p
? ? 將p的內容自減

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276347.shtml

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

相關文章

2020年大前端技術趨勢解讀

導Lead語如今的前端早已不再拘泥于滿足頁面展示&#xff0c;而是開始延展到通過全棧來閉環產品。這表明前端已經有能力透過業務深入產業&#xff0c;繼而影響商業結果。這種表象的改變背后是本質的轉變&#xff0c;從更為宏觀的角度來說&#xff0c;前端正在通過持續的技術革新…

HTML默認樣式表CSS屬性

轉載鏈接&#xff1a;http://www.xiao-a.com/index.php/archives/440.html 開始的時候 *{margin:0;padding:0;}&#xff0c;當需要使用邊距的時候&#xff0c;就需要還原HTML默認CSS值了。以前一直在找這份 文檔&#xff0c;今天偶然在w3上看到了。除了inline和block的定義&…

第六集 MSF構思階段項目團隊的組建

第六集 MSF構思階段項目團隊的組建__Note轉載于:https://www.cnblogs.com/zencorn/archive/2009/10/18/1585495.html

lc濾波器是利用電感的感抗_你對LC諧振電路你都了解嗎

根據在電路中電感器L和電容C的連接方式不同&#xff0c;可以有兩種LC諧振電路&#xff0c;LC并聯諧振電路和LC串聯諧振電路。LC并聯、串聯諧振電路在應用中的變化較多&#xff0c;是電路中分析的一個難點&#xff0c;只有掌握LC并聯、串聯電路的阻抗特性等基本概念&#xff0c;…

給小程序再減重 30% 的秘密?(京喜小程序首頁瘦身實踐)

前言—在 web 開發場景&#xff0c;減少代碼體積雖然是性能優化的一個方向&#xff0c;還沒到錙銖必較的程度。但是在小程序場景&#xff0c;由于代碼包上傳階段限制了主包 2M 和總包 16M&#xff08;近期微信官方正在內測將總包上限調整至 20M &#xff09;的尺寸&#xff0c;…

rfc mail content-type

轉載鏈接&#xff1a;http://www.w3.org/Protocols/rfc1341/0_TableOfContents.html RFC 郵件正文類型列表&#xff1a; Note: this is a hypertext versionof RFC1341 which has been obsoletedby RFC1521, of which no hypertextversion currently exists. Text …

Coolite Toolkit入門指南

Coolite Toolkit 簡介 Coolite Toolkit 是一個支持ASP.NET AJAX的Web控件Coolite Toolkit是基于跨瀏覽器的ExtJS 庫開發而來的&#xff0c;并且簡化了開發步驟&#xff0c;包含有豐富的Ajax運用Coolite Toolkit和ExtJS 都是開源的可能通過SVN直接獲取Coolite 的代碼簡單的說,就…

本周ASP.NET英文技術文章推薦[10/21 – 10/27]

這一篇是《本周ASP.NET英文技術文章推薦》系列的第一篇&#xff0c;在這個系列中&#xff0c;我將介紹5-10篇比較有價值的、本周發布的、與ASP.NET相關的英文技術文章&#xff0c;幫助各位朋友從良莠不齊的大量文章中挑出一些我認為非常有價值閱讀的&#xff0c;在進行一段簡要…

vim 離線安裝_VIM學習筆記 插件列表(Plugin)

由于zhihu的垃圾編輯器不支持表格&#xff0c;請查看以下完整格式&#xff1a;http://yyq123.github.io/learn-vim/learn-vim-plugin.html說明&#xff1a;本列表完全基于作者的主觀體驗&#xff0c;既不客觀也不完整&#xff1b;建議使用vim-plug或Vundle等插件管理器&#xf…

3 年前端面經和他在創業公司的成長歷程

在掘金上當了幾年的伸手黨&#xff0c;最近也準備輸出一些自己的東西。關于我首先介紹一下我自己&#xff0c;17 年畢業于一所 211 學校&#xff0c;但是由于大學四年馳騁在召喚師峽谷&#xff0c;畢業時也沒有找到一份大廠的工作&#xff0c;隨便找了一家創業公司簽了三方就去…

Spring.NET學習筆記9——打造簡易的依賴注入框架(練習篇) Level 100

我們在第三篇中學習里一個簡易的IoC框架。今天我們接著上次的程序&#xff0c;實現帶參數構造函數對象的實例和屬性的注入 。  我們知道可以通過反射獲取類的構造函數及參數(GetConstructors方法)&#xff1b;可以獲取屬性和屬性的類型(GetProperties方法)。通過Activator的C…

PHP 利用Mail_MimeDecode類提取郵件正文

參考鏈接&#xff1a;http://blog.csdn.net/dmtnewtons_blog/article/details/18765289 rfc mail content-type&#xff1a; 參考鏈接&#xff1a;http://blog.csdn.net/dmtnewtons_blog/article/details/19327105 根據主流的郵件解析類Mail_MimeDecode&#xff0c;提取郵件正…

android 單元測試

首先AndroidManifest.xml View Code <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.travelsky.test" android:versionCode"1"androi…

申萬一級行業日指數_基金收評 | 指數震蕩走弱,軍工股成兩市主線!后期行情如何?...

收評君復盤日記(2020年9月21日)三大指數集體收跌&#xff0c;北向資金全天大幅凈流出近65億元&#xff0c;軍工板塊表現強勢。盤面回顧9月21日&#xff0c;兩市全天高開低走&#xff0c;早盤指數弱勢震蕩&#xff0c;三大指數盤中一度翻紅&#xff0c;但隨后震蕩走弱&#xff0…

若川的2016年度總結,畢業工作

可以點擊上方的標簽若川的故事、年度總結&#xff0c;查看往期文章有讀者反饋說看我年度總結系列比我源碼系列更有啟發。所以打算把2016-2018的年度總結發布到公眾號聲明原創&#xff0c;希望對大家有所啟發。&#xff08;雖然我的每一年都過得非常普通...&#xff09;以下是正…

jQuery之Ajax

轉載鏈接&#xff1a;http://cargoj.iteye.com/blog/1008047 1 . jQuery幫助之Ajax請求&#xff08;一&#xff09;jQuery.ajax(options) 2 . jQuery幫助之Ajax請求&#xff08;二&#xff09;jQuery.get(url,[data],[callback] 3 . jQuery幫助之Ajax請求&#xff08;三&am…

深入淺出之正則表達式(二)

深入淺出之正則表達式&#xff08;二&#xff09; http://dragon.cnblogs.com/archive/2006/05/09/394923.html 前言&#xff1a; 本文是前一片文章《深入淺出之正則表達式&#xff08;一&#xff09;》的續篇&#xff0c;在本文中講述了正則表達式中的組與向后引用&…

MVC(溫習深入)

MVC&#xff08;Model-View-Controller&#xff0c;模型—視圖—控制器模式&#xff09;是軟件工程中的一種軟件架構模式。它把軟件系統分為三個基本部分&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;視圖&#xff08;View&#xff09;和控制器&#xff08;Contr…

面試官問:能否模擬實現JS的new操作符(高頻考點)

可以點擊上方的話題JS基礎系列&#xff0c;查看往期文章這篇文章寫于2018年11月05日&#xff0c;new模擬實現&#xff0c;Object.create是面試高頻考點&#xff0c;之前發布在掘金有近2萬人閱讀&#xff0c;現在發布到公眾號聲明原創。1. 前言這是面試官問系列的第一篇&#xf…

Linux環境下設置IPDNSGateway

轉載鏈接&#xff1a;http://www.myhack58.com/Article/sort099/sort0102/2011/29291.htm 在Linux中不管你是做服務器還是只是平常使用&#xff0c;上網肯定都是最重要和不可缺少的一個因素之一&#xff0c;所以就涉及到它的ip gateway dns等network配置和使用。但是設置Linux…