指針數據類型 java_C/C++ 指針的小結——指針與其它數據類型(數組、字符串、函數、結構體)的關系...

一、指針與數組和字符串

1、指針與數組

當聲明數時,編譯器在連續的內存空間分配基本地址和足夠的儲存空間,以容納數組的所有元素。基本地址是數組第一個元素(索引為0)的存儲位置。編譯器還把數組名定義為指向第一個元素的常量指針。

元素的地址是通過索引和數據類型的比例因子來計算的;例如: x[3]的地址 = 基本地址 + (3 x 整型數據的比例因子)

如何表示元素a[i][j]的(其中:int *p; p = a;);

0

1

2

3

4

5

1

2

3

4

p----指向第 0 行的指針;

p + i----指向第 i 行的指針;

*(p+i)----指向第 i 行的第一個元素的指針;

*(p+i)+j----指向第 i 行第 j 個元素的指針;

*((p+i)+j)----存儲在(i, j)單元(即第 i 行第 j 列)的值。

數組 a 的基本地址為 &a[0][0],從這個地址開始,編譯器按行為所有的元素分配連續的存儲空間。例如:

int a[3][4] ={

{15,27,11,35},

{22,19,31,17},

{31,23,14,36}

}

數組a的存儲如下:

|15 |27| 11| 35 |22 |19 |31 |17 |31 |23 |14 |36 | |--

如果把 p 聲明為整型指針,并且初始地址為a[0][0](),那么:

a[i][j] = *(p+4*i+j);

2、指針與字符串

C語言支持另一種創建字符串的方法,即使用char類型的指針變量。例如:

char *str = "good";

上述聲明語句創建了一個文本字符串,然后將其地址保存在指針變量str中;這樣指針 str 就指向字符串 “good” 的第一個字符,如下所示:

|g(str) | o | o | d | \0 | |--

由此,可以用指針訪問整個字符串:

printf("%s",str);

put(str);

當然,也可以用指針來訪問字符串中的單個字符。

3、指針數組

指針的一項重要的應用就是處理字符串表,特別是處理行的長度可變的“凹凸不平的數組”時;例如:

char *name[3] = { "New Zealand", "Australia", "India" };

上面的聲明語句只分配了28個字符,這足以保存所有的字符,具體如下:

|N| e |w | |Z |e |a |l |a| n| d| \0| |-- |A| u| s| t| r| a| l| i| a| \0| |I| n| d| i| a| \0| 下面的語句可以用來顯示著三個名稱:

for(i = 0; i <= 2; i++) printf("%s\n",name[i]);

要訪問第 i 個名稱的第 j 個字符,可以這樣編寫語句:

char c = *(name[i]+j);

二、指針與函數

1、將指針作為函數的參數

使用指針傳遞變量地址的函數調用過程稱為引用調用(我們已經說過,傳遞變量實際值的過程稱為 “按值調用”)。引用調用提供了一種機制,讓被調用的函數可以修改調用函數中存儲的值。 請注意以下代碼:

//例一

void exchange(int *a, int *b)

{

int t;

t=*a;

*a=*b;

*b=t;

}

void main()

{

int x, y;

x = 100;

y = 200;

printf("%d ,%d\\n",x,y);

exchange(&x,&y);

printf("%d ,%d\\n",x,y);

}

//例二

void exchange(int *a, int *b)

{

int *t;

t=a;

a=b;

b=t;

printf("%d ,%d\n", *a, *b);

}

void main()

{

int x, y;

x = 100;

y = 200;

printf("%d ,%d\n", x, y);

exchange(&x,&y);

printf("%d ,%d\n", x, y);

}

代碼例二并不會使x,y的值發生互換,因為當函數指針a,b獲得x,y的地址后,作為值進行儲存,交換a,b的值并沒有改變其值(x,y的地址)指向的x,y的值。

2、函數返回指針

指針是C語言的一種數據類型,因此也可以使用函數返回一個指向調用函數的指針。請看下面的代碼:

int *larger(int* , int*);/*prototype*/

main()

{

int a = 10;

int b = 20;

int *p;

p = larger(&a, &b);/*Function call*/

printf("%d",p);

}

int *larger(int *x, int *y)

{

if(*x > *y)

return(x);/*address of a*/

else

return(y);/*address of b*/

}

注意:返回的地址必須是調用函數中變量的地址。如果返回的是指向被調用函數中局部變量的地址;將產生錯誤。

3、指向函數的指針

與變量一樣,函數也屬于某種數據類型,在內存中也需要有儲存地址。因此可以聲明一個指向函數的指針。如同指向字符數組的指針,可以接收任意大小的字符數組一樣,指向函數的指針可以指向任意的函數,如此可以減少函數的數量,使函數的功能更加強大。指向函數的指針聲明如下:

type (*fptr)();

該語句告訴編譯器,fptr為指向函數的的指針,返回type類型的值。用括號把*fptr括起來是必要的。記住,下面的語句:

type *gptr();

表示的是把gptr聲明為函數,它返回一個指向type類型的指針。

請仔細關注以下代碼:

#include

#include

#define PI 3.1415926

double table(double (*f)(), double, double, double);

double y(double);

double cos(double);

double table(double (*f)(), double min, double max, double step)

{

double a, value;

for(a = min;a <= max; a+=step){

value = (*f)(a);

printf("%5.2f %10.4f\n,a,value");

}

}

double y(double x)

{

return (2*x*x-x+1);

}

void main()

{

printf("table of y(x) = 2*x*x-x+1\n\n");

table(y, 0.0, 2.0, 0.5);

printf("table of cos(x)\n\n");

table(cos, 0.0, PI, 0.5);

}

三、指針與結構體

在前面章節中,我們討論把結構體作為參數傳遞給函數。我們還看到這樣的實例,其中函數接收整個結構體的副本,并在運行后把他返回給調用函數。正如我們前面介紹的那樣,該方法無論是在運行速度還是在內存使用上都不是高效的。通過以指向結構體的指針作為傳遞參數,然后使用指針來操縱結構體成員,就可以克服該缺點。請看以下函數:

print_invent(struct *item)

{

printf("Name: %s\n", item->name);

printf("price:%f\n", item->price);

}

該函數可以用下面的語句來調用:

print_invent(&product);

請關注以下兩點:

數組名表示的是第0個元素的地址。結構體變量的數組名也是如此;

運算符“->”、“.”、“()”和“[]”的有先級最高。正確理解優先級及關聯性非常重要。

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

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

相關文章

Linux tr命令詳解

tr是個簡單的替換命令&#xff0c;從標準輸入中替換、縮減和/或刪除字符&#xff0c;并將結果寫到標準輸出。 tr常見命令參數 用法&#xff1a;tr [選項]... SET1 [SET2] 從標準輸入中替換、縮減和/或刪除字符&#xff0c;并將結果寫到標準輸出。-c, -C, --complement …

512M內存編譯php出錯

make時錯誤如下 1 virtual memory exhausted: Cannot allocate memory make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1 內存小造成的&#xff0c;為了成功的話需要加上參數 –disable-fileinfo即可參考鏈接&#xff1a;https://bugs.php.net/bug.php?id48809 轉載于…

Android中插件開發篇總結和概述

剛剛終于寫完了插件開發的最后一篇文章&#xff0c;下面就來總結一下&#xff0c;關于Android中插件篇從去年的11月份就開始規劃了&#xff0c;主要從三個方面去解讀Android中插件開發原理。說白了&#xff0c;插件開發的原理就是&#xff1a;動態加載技術。但是我們在開發插件…

java反射機制 路徑_Java 反射機制詳解

引言本文主要介紹Java中&#xff0c;有關反射機制、類的加載過程、以及控制反轉方面的內容。Java 反射機制Java創建對象的方式有哪些&#xff1a;new、反射、反序列化、克隆class對象獲取的方法有哪些&#xff1a;類名.class、getClass、forName、classLoader.loadClass(‘包類…

prop和attr在 jquery的

https://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html轉載于:https://www.cnblogs.com/beimingbingpo/p/9254680.html

java傳入數據庫生成柱狀圖_Java讀取數據庫數據生成柱狀圖

此案例是用swing顯示數據的。須要引入jfreechart相關包。不同版本號可能包不同樣。本人用的是此案例在ssi框架下會報錯&#xff0c;不用框架就沒問題。Java后臺邏輯代碼&#xff1a;public class BarChart {ChartPanel frame1;public BarChart() {CategoryDataset dataset get…

SVN系列操作(一)

SVN是什么&#xff1f; SVN是Subversion的簡稱&#xff0c;是一個開放源代碼的版本控制系統&#xff0c;常用于軟件開發項目中&#xff0c;實現代碼、文檔等的歷史版本保存、共享和權限管理。 進入SVN本地目錄&#xff0c;第一步操作就是update。 為什么呢&#xff1f;因為SVN是…

ubuntu-14.04.2-desktop使用方法

一、安裝VMware Tools 1. 在VMware Workstation11.1.0下安裝Ubuntu鏡像&#xff1a;ubuntukylin-14.04.2-desktop-amd64.iso 2. 點擊虛擬機菜單欄-安裝VMware Tools。 3. 在Ubuntu系統光盤中找到VMwareTools-9.9.2-2496486.tar.gz&#xff0c;右鍵復制到“桌面”&#xff0c;然…

ubuntu 跟xshell的問題

有2個分析&#xff1a; 1&#xff1a;是windos的防火墻沒有關閉 2&#xff1a;是虛擬機沒有安裝sshd服務器 ubuntu在CLI界面下輸入&#xff1a;dpkg -l |grep ssh 因為是我安裝過的sshd server 要是沒有sshd server 就要輸入 安裝。 三&#xff1a;要是安裝完之后 鏈接顯示說…

java gdal postgresql_使用GDAL/OGR操作Postgresql數據庫

&#xfeff;&#xfeff;GDAL(Geospatial Data AbstractionLibrary)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。本文將使用GDAL/OGR庫讀寫Postgresql數據庫中的表&#x…

Go語言基礎之1--標識符、關鍵字、變量和常量、數據類型、Go的基本程序結構、Golang的特性...

一、前言 當我們項目較為簡單時&#xff0c;我們在src目錄下新建一個該項目目錄&#xff0c;里面存放源碼文件即可&#xff0c;見下圖&#xff1a; 當我們一個項目較為復雜時&#xff0c;我們可以在src目錄下新建一個該項目目錄&#xff0c;在針對該項目不同模塊創建不同目錄&a…

java參數轉換匹配規律_隱式轉換規則

隱式轉換在如下三種不同的情況會被考慮&#xff1a;1、當對象A調用某個方法時&#xff0c;這個方法不存在例如在前一節介紹的1 to 10。會將Int轉換為RichInt&#xff0c;然后再調用to方法。在這種情況下&#xff0c;會將對象A(方法的調用者)隱式轉換為另一個對象。2、當對象A調…

Semantic-UI的React實現(二):CSS類構造模塊

更簡單的類名標簽 Semantic-UI使用了更簡單的類名聲明。用過Bootstrap的同學都會被其復雜的類名標簽折磨過&#xff0c;例如一個簡單的按鍵樣式&#xff0c;不論顏色或是大小&#xff0c;都需要btn-前綴聲明&#xff1a; <button type"button" class"btn btn…

T-SQL LIKE子句 模糊查詢

MS SQL Server LIKE子句用于使用通配符運算符將值與類似值進行比較。 有兩個通配符與LIKE運算符結合使用: 百分號&#xff08;&#xff05;&#xff09;下劃線&#xff08;_&#xff09;百分號表示零個&#xff0c;一個或多個字符。 下劃線表示單個數字或字符。 符號可以組合使…

ext springmvc mysql_基于ExtJs6前臺,SpringMVC-Spring-Mybatis,resteasy,mysql無限極表設計,實現樹狀展示數據(treepanel)...

先從后臺講起1.表的設計2.mysql查詢很容易&#xff0c;關鍵是要把id,text,parentId查出來/p>"http://mybatis.org/dtd/mybatis-3-mapper.dtd">SELECTbp.id,bb.name brandName,bp.name text,bp.photo_url photoUrl,bp.number,bp.add_time addTime,bp.modify_tim…

C# 之 Int16 Int32 Int64 的區別

Int16 值類型表示值介于 -32768 到 32767 之間的有符號整數。 Int32 值類型表示值介于 -2,147,483,648 到 2,147,483,647 之間的有符號整數。 Int64 值類型表示值介于 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之間的整數。 --------------------------------…

php說明代碼怎么寫,代碼怎么寫 - 起步 - PHP基礎 - KK的小故事

起步 - 代碼怎么寫 作者&#xff1a;KK發表日期&#xff1a;2016.3.9要寫PHP代碼就需要建立.php后綴的文件,并且在文件里要以<?php 具體代碼 ?>這樣的形式來書寫PHP代碼我們在網站目錄下新建一個叫index.php的文件,并在里面編寫這樣的代碼:echo Hello World!;?>然后…

python中的計算符號

1、算數計算符號&#xff1a; - * /   //&#xff08;取整&#xff09;  %&#xff08;取余&#xff09;  **&#xff08;次方&#xff09; 1 >>> 682 143 >>> 9-34 65 >>> 3*46 127 >>> 16/28 8.09 >>> 9/2 10 4.5 11 >…

MySQL 索引優化全攻略

2019獨角獸企業重金招聘Python工程師標準>>> 所謂索引就是為特定的mysql字段進行一些特定的算法排序,比如二叉樹的算法和哈希算法,哈希算法是通過建立特征值,然后根據特征值來快速查找。而用的最多,并且是mysql默認的就是二叉樹算法 BTREE,通過BTREE算法建立索引的字…

織夢DedeCMS實現 三級欄目_二級欄目_一級欄目_網站名稱 的效果代碼

1.將官方原來的排列方式反過來&#xff0c;找到include/typelink.class.php第164行 $this->valuePositionName $tinfos[typename].$this->SplitSymbol.$this->valuePositionName; 修改為&#xff1a; $this->valuePositionName $this->valuePositionName.$…