指針類型轉換(轉)

當我們初始化一個指針或給一個指針賦值時,賦值號的左邊是一個指
針,賦值號的右邊是一個指針表達式。在我們前面所舉的例子中,絕大
多數情況下,指針的類型和指針表達式的類型是一樣的,指針所指向的
類型和指針表達式所指向的類型是一樣的。
例十五:
float f=12.3;
float *fptr=&f;
int *p;
在上面的例子中,假如我們想讓指針p 指向實數f,應該怎么辦?
是用下面的語句嗎?
p=&f;
? 不對。因為指針p 的類型是int *,它指向的類型是int。表達式
&f 的結果是一個指針,指針的類型是float *,它指向的類型是float。
兩者不一致,直接賦值的方法是不行的。至少在我的MSVC++6.0 上,對
指針的賦值語句要求賦值號兩邊的類型一致,所指向的類型也一致,其
它的編譯器上我沒試過,大家可以試試。為了實現我們的目的,需要進
行"強制類型轉換":
p=(int*)&f;
? ?如果有一個指針p,我們需要把它的類型和所指向的類型改為
TYEP *TYPE, 那么語法格式是: (TYPE *)p;
這樣強制類型轉換的結果是一個新指針,該新指針的類型是
TYPE *,它指向的類型是TYPE,它指向的地址就是原指針指向的地址。
而原來的指針p 的一切屬性都沒有被修改。(切記)
一個函數如果使用了指針作為形參,那么在函數調用語句的實參和
形參的結合過程中,必須保證類型一致,否則需要強制轉換
例十六:
void fun(char*);
int a=125,b;
fun((char*)&a);
void fun(char*s)
{
charc;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
?? 注意這是一個32 位程序,故int 類型占了四個字節,char 類型占一個
字節。函數fun 的作用是把一個整數的四個字節的順序來個顛倒。注意
到了嗎?在函數調用語句中,實參&a 的結果是一個指針,它的類型是
int *,它指向的類型是int。形參這個指針的類型是char *,它指向
的類型是char。這樣,在實參和形參的結合過程中,我們必須進行一
次從int *類型到char *類型的轉換。結合這個例子,我們可以這樣來
想象編譯器進行轉換的過程:編譯器先構造一個臨時指針char *temp,
然后執行temp=(char *)&a,最后再把temp 的值傳遞給s。所以最后的
結果是:s 的類型是char *,它指向的類型是char,它指向的地址就是
a 的首地址。
?? 我們已經知道,指針的值就是指針指向的地址,在32 位程序中,
指針的值其實是一個32 位整數。那可不可以把一個整數當作指針的值
直接賦給指針呢?就象下面的語句:
unsigned int a;
TYPE *ptr; //TYPE 是int,char 或結構類型等等類型。
a=20345686;
ptr=20345686; //我們的目的是要使指針ptr 指向地址20345686
ptr=a; //我們的目的是要使指針ptr 指向地址20345686
編譯一下吧。結果發現后面兩條語句全是錯的。那么我們的目的就不能
達到了嗎?不,還有辦法:
unsigned int a;
TYPE *ptr; //TYPE 是int,char 或結構類型等等類型。
a=N //N 必須代表一個合法的地址;
ptr=(TYPE*)a; //呵呵,這就可以了。
嚴格說來這里的(TYPE *)和指針類型轉換中的(TYPE *)還不一樣。這里
的(TYPE*)的意思是把無符號整數a 的值當作一個地址來看待。上面強
調了a 的值必須代表一個合法的地址,否則的話,在你使用ptr 的時候,
就會出現非法操作錯誤。
想想能不能反過來,把指針指向的地址即指針的值當作一個整數取
出來。完全可以。下面的例子演示了把一個指針的值當作一個整數取出
來,然后再把這個整數當作一個地址賦給一個指針:
例十七:
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr; //把指針ptr 的值當作一個整數取出來。
str=(char*)b; //把這個整數的值當作一個地址賦給指針str。
現在我們已經知道了,可以把指針的值當作一個整數取出來,也可
以把一個整數值當作地址賦給一個指針。

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

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

相關文章

143. Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes values. For example,Given {1,2,3,4}, reorder it to {1,4,2,3}. public void ReorderList(ListNode head) {if(h…

Halcon圖像濾波方法與原理概述

目錄簡介Halcon算子與算法原理基礎濾波a、均值濾波b、中值濾波c、高斯濾波d、導向濾波簡介 圖像濾波,即在盡量保留圖像細節特征的條件下對目標圖像的噪聲進行抑制,是圖像預處理中不可缺少的操作,其處理效果的好壞將直接影響到后續圖像處理和…

碎片化學習不是學習碎片,看這篇了解碎片化學習的真相

高效學習的定義:找到最適合自己的學習手法,在相對短的時間內集中注意力,以解決一個工作生活當中的難題為目的著手學習,你需要勤加練習,有時候還需要向名師求助。——許岑為什么會出現碎片化學習? 隨著科技的…

一篇能加深理解linux 虛擬文件系統的博文

URL: http://asionius.com/article/9 https://www.ibm.com/developerworks/cn/linux/l-vfs/轉載于:https://www.cnblogs.com/rocklee25/p/6926267.html

如何強制ffmpeg編碼時輸出一個關鍵幀

原文地址:http://www.ffmpeg.com.cn/index.php/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6ffmpeg%E7%BC%96%E7%A0%81%E6%97%B6%E8%BE%93%E5%87%BA%E4%B8%80%E4%B8%AA%E5%85%B3%E9%94%AE%E5%B8%A7 如何強制ffmpeg編碼時輸出一個關鍵幀 AVCodecContext *c //編碼器環境句…

Halcon深度學習環境搭建(win下)全網最全教程

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/cashmood/article/details/105042928 文章目錄halcon深度學習介紹系統與環境搭建1、對電腦系統與硬件…

第二周進度及工作量統計

項目:詞頻統計修改 項目類型:個人項目 項目完成情況:已完成 項目改進:第二次改進 項目日期:2016.9.14----2.16.9.14 CCSEIT分析需求,設計15:2015:30010編碼實現15:3016:20050文檔程序說明,隨筆2…

p1484 種樹

傳送門 題目 cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由于cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力&#xff0c…

Dalsa線掃相機SDK開發-小試牛刀(1)

拿到了dalsa相機,可以用Sapera軟件配置相機,進行圖像采集。但是自己開發的話就得擼起袖子寫代碼了,查了兩篇不錯的博文,作為指導。 Sapera幫助文檔 - 《好好先生》專欄 - 博客頻道 - CSDN.NET http://blog.csdn.net/liubing8609/a…

用FFMPEG SDK進行視頻轉碼壓縮時解決音視頻不同步問題的方法(轉) PTS DTS

用FFMPEG SDK進行視頻轉碼壓縮的時候,轉碼成功后去看視頻的內容,發現音視頻是不同步的。這個的確是一個惱火的事情。我在用FFMPEG SDK做h264格式的FLV文件編碼Filter的時候就碰到了這個問題。經過研究發現,FFMPEG SDK寫入視頻的時候有兩個地方…

深度學習環境搭建(GPU)CUDA安裝(完全版)

文章目錄1、查詢電腦硬件2、環境搭建與軟件安裝1、安裝CUDA運算平臺軟件2、安裝cuDNN支持包3、配置環境變量3、驗證CUDA與cuDNN安裝前幾天在看深度學習。因為對深度學習不是很了解,在配置環境時走了許多彎路,也總是戰戰兢兢的。現在對深度學習的環境搭建…

Linux 中的文件壓縮與解壓

.tar tar xvf FileName.tar # 解壓 tar cvf FileName.tar DirName # 壓縮 .gz gunzip FileName.gz # 解壓 gzip -d FileName.gz # 解壓 gzip FileName # 壓縮 .tar.gz 和 .tgz tar zxvf FileName.tar.gz # 解壓 tar zcvf FileName.tar.gz DirName # 壓縮 .bz2 bzip2 -d FileNam…

Unity3D游戲開發之自由視角下的角色控制

秦元培的博客:http://blog.csdn.net/qinyuanpei/article/details/39125353 1,[Unity3D]Unity3D游戲開發之角色控制漫談 2,[Unity3D]Unity3D游戲開發之自由視角下的角色控制 3,[Unity3D]Unity3D游戲開發之仿仙劍奇俠傳角色控制效果 轉載于:h…

Pycharm用鼠標滾輪控制字體大小

一、pycharm字體放大的設置 File —> setting —> Keymap —>在搜尋框中輸入:increase —> Increase Font Size(雙擊) —> 在彈出的對話框中選擇Add Mouse Shortcut 在彈出的對話框中同時按住ctrl鍵和鼠標滾輪向上滑。 二、…

Halcon自定義函數封裝方法(全網最詳細)

文章目錄1、名詞解釋2、例子介紹1、處理原圖與任務:2、代碼與解析:3、Halcon函數封裝方式①明確需求②選取函數部分進行函數創建,更改函數接口③運行驗證與函數更改操作有網友說不太清楚這個halcon函數的封裝方法。今天寫個教程帖子&#xff…

ffmpeg庫音頻解碼示例

#include <stdio.h> #include <stdlib.h> extern "C"{// #include "avcodec.h" #include "avformat.h" } int main(char arg,char *argv[]) { char *filename "02.swf"; av_register_all();//注冊所有可…

SQL Where in list 問題

不過,這種做法有兩個缺陷1.Oracle In列表的數目有限制(1000)2.不能復用執行計劃,每次幾乎都是硬解析.3.In拼接可能存在SQL注入的風險

readn writen實現linux下socket緩沖區讀寫

socket上的read write 操作不同與一般的文件IO操作&#xff0c;socket上的用read write讀寫的字節數可能比要求的少,但這并不是錯誤&#xff0c;原因是socket的緩沖區可能已經達到了極限。此時所需要的就是再次調用read write 以寫入或輸出剩余的字符。這種情況在socket中很常見…

傅里葉變換進行缺陷檢測detect_indent_fft.hdev(源代碼與詳細解析)

文章目錄簡介程序解析處理結果預覽算法講解簡介 detect_indent_fft.hdev是halcon的示例程序&#xff0c;是傅里葉變換進行缺陷檢測的一個例子&#xff0c;主要是傅里葉變換在復雜背景下的缺陷檢測。 這個程序展示了如何利用快速傅里葉變換&#xff08;FFT&#xff09;對塑料制…

lua環境搭建

前言 Linux & Mac上安裝 Lua 安裝非常簡單&#xff0c;只需要下載源碼包并在終端解壓編譯即可&#xff0c;本文介紹Linux 系統上&#xff0c;lua5.3.0版本安裝步驟&#xff1a; Linux 系統上安裝 [rootgitlab ~]# mkdir /app/tools/lua -p [rootgitlab ~]# cd /app/tools/l…