『壹』 c語言的指針有什麼優缺點
個人覺得是很好的一篇文字,說得很清楚:
C是一個結構化語言,如譚老爺子所說:它的重點在於演算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制),而對於C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。
所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為「 設計這個概念已經被融入到C++之中 」,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程序設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,「C加上好的設計」也能寫出非常好的東西。
對語言本身而言,C是C++的子集,那麼是什麼樣的一個子集?從上文可以看出, C實現了C++中過程化控制及其它相關功能,而在C++中的C(我稱它為「C+」),相對於原來的C還有所加強,引入了重載、內聯函數、異常處理等等玩藝兒,C++更是拓展了面向對象設計的內容,如類、繼承、虛函數、模板和包容器類等等。
再提高一點,在C++中,數據封裝、類型這些東東已不是什麼新鮮事了,需要考慮的是諸如:對象粒度的選擇、對象介面的設計和繼承、組合與繼承的使用等等問題。
所以相對於C,C++包含了更豐富的「設計」的概念,但C是C++的一個自洽子集,也具有強大的功能,同樣值得學習。
幾點學習建議:
1.基本概念很重要。無論學C,還是學C++,基本概念都是第一位的,也是比較困難的,但只有把握了基本概念才能把握整體脈絡,才能居高臨下。
2.C是C++的子集,它的基本概念和設計方法相對比較容易理解,初學者可從它入手。
3.如果要學好C++,建議初學者最好別在如VC,BCB平台下寫程序,那種自動化的代碼生成,花花綠綠的界面,會讓你手足無措。最好先找一片空地(unix,dos),從頭做起,寫幾個大點的程序,數個回合,再到VC,BCB下看看,你會輕松得很。在我看來,學好C/C++是成為VC,BCB高手的必由之路。
4.不要妄想速成,必須得一個byte,一個bit的去摳,盡量搞清楚每一個問題。
5.幾本好書:
機械工業出版社的那套「計算機科學叢書」從C到C++,到面向對象設計,一應俱全,都TMD是經典中的經典,而且價格公道,童叟無欺。
國內也有幾本好書,譚老爺子的書好倒是好,就是程序錯誤太多。強烈推薦清華周之英的《現代軟體工程》(上、中、下),它是我所見到的國內少有的一本好書,精華的精華,要點的要點,細細品來,至少也屬降龍十八掌等級的東東。
如果還是有人想學習C/C++的話, 有一些小問題我還是樂意解答的. 但是我認為學習C/C++是不重要的, 重要的是如何鍛煉你的思路. 不要找一些連自己都搞不清的問題去做.
我認為雖然 "潭浩強" 同志有騙錢的嫌疑( 我手頭就有一本幾乎一模一樣的英文書 ), 但是, 是他把這本入門手冊引入中國, 使無數程序員了解了C語言, 我想他的功勞也是不可磨滅的. 在< C語言程序設計 >這本書中所有的例子都可以用做鍛煉思路的基石, 他對大家的編程是很有幫助的. 我認為是值得一買的. 去思考課後的例子對你的編程很有幫助. 不要小看一個一個簡單的例子, 他們是你通往成功的道路.
當你基本能夠掌握了上一本書中例子後, 你就要自己找一些例子程序去看. 開始可能是看不懂, 但是只要努力就沒有什麼問題. 當你看過幾個較大的例子之後, 你會茅塞頓開, ( 大量閱讀例子程序是學習C/C++的捷徑 ). 你會發現, 你的水平有了顯著的提高. 你看的例子越多, 你對 Windows/DOS 了解的越多. 最好能夠再看一些關於系統知識的書籍. 他會對你的編程很有幫助的.
這是我學習C/C++的一點心得, 希望對沒有被我嚇到而要繼續學習C/C++的朋友們有一些幫助. 免得有些同志說我破壞中國軟體人才的發展.
在最後我祝願所有堅持學習C/C++的朋友們成功! 同時感謝閱讀過我文章的同志們.
想學好C++,非學C不可!!!
今天我這么肯定的在這里講這番話,是不想初學者陷入到語言越新越好的誤區,本來這個題目就不是很嚴謹,但是我有幾句話必須講講,為C平反!!
C++與C有什麼不同呢?我們現在一步步地來分析一下
一、類,類我並不說它有什麼不好,但是對於初學者,它是一個累贅。類的封裝使得初學者對程序產生厭倦,感到不適和麻煩。
二、引用,引用是C++中最臭屁的東西了,最好盡量不要用它,我就是從來不用引用,除非萬不得已。引用對於初學者就更容易產生混淆,不知道哪個是引用,哪個是變數。
三、函數的重載,初學者學函數的重載好像沒什麼壞處,但是,這會使初學者潛意識里對C語言的變數類型的重要性產生淡化,要記住C語言是對變數類型最敏感了的,變數的類型在C語言里的重要性是不言而喻的。
四、流操作符,和上面同樣的道理,使得對變數類型的重要性產生淡化,況且,cin這個東東有點兒不怎麼方便,有時會產生使初學者莫名其妙的結果。
五、操作符重載,典型的高級應用,初學者可能根本用不著,這個東東會讓他們覺得C++很難,門檻高,看不懂…………。
六、繼承,以及虛函數,典型的模仿四不象,這種狗屁東西除了看起來深奧,實用價值很低………………。我怎麼可能把某個類的類型的指針去指向另一個不同類型但是是繼承關系的類,來實現什麼動態聯編,暈…………
………………還有些東東我就不發表評論了,如:new,delete操作符等…………
七、誤區:以問答形式:
問:C++是面向對象化的而C是面向過程化的?
答:第二對,第一問錯,C++並非完全面向對象化,真正的面向對象化的語言恐怕只有Java才算得上。
問:C++能實現C所不能的功能嗎?
答:至少我還沒有發現……
問:學了C再學C++有障礙嗎?比如程序設計思想……
答:至少我還沒有看見誰有此症狀。
問:學了C再學C++又要重頭開始嗎?
答:不,C++下可以實現C語言的一切功能。
問:我學完了C一定還要學C++才能編程嗎?
答:完全沒必要。
問:C++比C好在哪裡?
答:更加符合軟體工程學
問:學完了C再學C++是不是很容易?
答:那要看你是不是真正的學完了C語言,我從C到C++就一個星期的睡覺前的時間看兩眼書,然後就大徹大悟。再跑到這里來發表些狗屁文章了。
最近在網上看到了很多人的學習方法,本人非常不贊同。很多人都想一口吃個胖子,要學就想學最新的,好象沒有人願意再去學那些老的,舊的編程語言了。但你們能學的懂嗎?不學TC2。0等那些較早的優秀編程語言,你們能理解的了VC6。0?如果你真的能,我寧願做你的徒弟!真是奇怪,那些最基本的語言都不懂的人,怎麼可能去理解那些最新的編程語言?我學編程有三年了吧。成績也不算多,只有一個計算機四級證和一個高程證,但我覺得我在學VC的時候還有很多的不明白的地方。沒有人來教我,只能靠我自己,包括所有的成績在內,我都是靠自己,我從不報班。學VC的半年多來,我想我已經基本入門,但依然有很多的困惑。剛開始學VC,就面臨一個項目,我真的猶如笨蛋一般,四處嚇摸,毫無頭緒,最後勉勉強強才算做個差不多。學好VC再去學其他的高級WINDOWS編程,我想那真是輕而易舉,畢竟WINDOWS的內部的很多東西都能直接被VC調用,你首先就可以對WINDOWS有個全新的認識,再去學其他的語言豈能不簡單?
我的感覺是,面向過程和面向對象,其實都很重要的,在VC里也依然需要面向過程,很多東西都是一環扣一環,沒有面向過程的思想,怎麼可能去編程呢?建議多去看看有關WINDOWS編程的書,但多數都是比較老的書呦!我依然記得當年整天進行TC編程的辛苦,但我依然很懷念當年的勞動付出,畢竟我獲得了我想獲得的一切——編程思想。我覺得一個好的編程思想,絕對比你去學一門計算機語言好重要的多。要形成自己的編程風格。一個好的編程思想在你的頭腦中一旦形成,學習什麼語言都會很輕而易舉,因為此時的你不在是簡簡單單的學習,而是來驗證!
『貳』 C語言指針的好處
指針一大特點是,對一個函數而言能實現多個返回值!
同時指針在某些情況下與數組有共通之處!
它能直接對一個內存進行操作,在加密技術上也有不小的作用力!
…………還有很多,程序寫的越多就越會感覺指針的重要作用的。
字元串處理的頭文件:string.h(希望對你有幫助)
『叄』 C語言指針的作用有哪些
指針的用途非常廣泛,比如如果你想通過函數改變一個變數的值,就得用指針而不能用值傳遞。還有在很多時候變數,特別是對象的數據量實在太大,程序員就會用指針來做形參,只需要傳遞一個地址就行,大大提高了效率。簡單地說指針就是指向變數和對象的地址。
『肆』 C語言中的指針到底有什麼用
所有變數值保存在內存中,而每個內存都有一個地址,所謂地址就是一個整數編號,如同門牌號碼用於定位(專業術語叫定址),一個地址對應一個位元組(8bit)的內存單元。
如今的編譯器,一個整數int類型的值佔用32位bit,也就是4位元組,編譯器將第一個位元組的編號定義為該整數的地址,由於保存地址的變數就像一個箭頭指向某地址,而稱為指針變數。
int a =10; //定義一個整數變數a,對其賦值10
int *p =&a;//定義一個指針變數p,對其賦值a的內存地址,&符號意思為引用跟隨其後的變數地址。
cont <<a<<end; //輸出 a的值:10
cont << p << end ;// 輸出p的值:XXXXX 其實為a的地址,該地址由編譯器和運行時確定。
cont << *p <<end; //輸出p指向的地址中的值:10,也就是a的值,*星號放在變數前面意思就是取該變數中的地址所指內存中的值。
讀取過程為:p的值(a的地址)->定址->取值
由於指針是一個變數的首個位元組的地址,所以要告訴編譯器被指地址包含連續多少個位元組,因此指針也有類型。比如上面例子中聲明了p指針是個整數指針,這樣編譯器知道p指向一個4位元組的內存塊。
你可以將指針變數看做一般的整數變數來理解,用來保存一個整數(地址是個整數),只是,該整數代表著某地址,在這里是a的地址。
在C/C++中很靈活,但是也很危險,也很難學,如果指針指向錯誤的地址會引起程序崩潰,因此在C#中已經被微軟封裝了,但內部還是有指針的。
如果有必要,C#中也可以使用指針,使用非安全代碼,在項目生成選項卡中勾選「允許非安全代碼」,然後就可以使用指針了,不過不建議這么做。
unsafe
{
int a = 10;
int* p=&a;
}
『伍』 C語言中,指針的重要性有多大不是很懂C指針
個人覺得指針應該說是很靈活吧,不能說他很重要,必將像是C++,JAVA等語言都沒有指針,所以,這也是學習C語言的難點吧!之所以說他靈活,是因為他可以訪問任何內存!比如:
p = &a;//變數a的地址;
p = A;//數組名A;
p = q;//指針q;
p = fun;//函數名fun;
p = NULL;//NULL;
不過要說好處,我覺應該是節省時間,提高程序運行的效率的,他可以靈活訪問。
『陸』 c語言中指針強大的功能體現在哪裡
樓上說的對啊,用指針就是用來直接操縱內存的,動態申請空間就是其中一個應用。
下面還有幾種經典的用法:
1.指針變數作為函數參數,在函數中修改變數的值。這個不用指針很難實現(c++中有引用可以實現)
void swap(int * p1, int *p2)
{// 在函數中交換兩個變數的值
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tm;
}
2.
你如果想在函數中返回多個值,應該怎麼辦呢?
可以選擇從主調函數中向被調用函數傳入參數,等待返回結果。
舉例:
void func(int *pa, int *pb, int *pc)
{// 你向函數中傳入三個參數,可以得到三個返回值了。
……
}
3.指針的主要應用就是直接操縱內存,這樣可以減少復制數據的時間。
struct Student
{
char name[10];
BOOL sex;
int score[10];
}
void func(struct Student *pst)
{// 傳址,減少了數據復制的時間,
// 有時為了防止參數被修改,可以改為 struct Student const *pst
}
void func(struct Student stu)
{// 傳值,需要把實參的值復制到stu中,有時耗費大量時間
}
4。
此外,還有常用到的數組,其實就是對內存直接操縱。其他的應用如指針與多維數組,指向函數的指針等。
『柒』 C語言數據指針用途及特點
是的
實際上函數在內存中也要佔據一片存儲單元,這片存儲單元的起始地址,我們稱其為函數的入口地址,即函數的指針,函數的入口地址是用函數名來表示的。
因此我們可以定義一個指針變數,讓它的值等於函數的入口地址,然後可以通過這個指針變數來調用函數,該指針變數稱為指向函數的指針變數。
這里還有兩個簡單程序關於指針和數組的區別
①實參和形參都用指針變數
#include<stdio.h>
voidinv3(int*x,intn);
voidmain()
{int*p,a[6]={1,3,4,6,7,9};
p=a;
inv3(p,6);
for(p=a;p<a+6;p++)
printf(「%3d」,*p);
printf(「 」);
}
voidinv3(int*x,intn)
{inttemp,m=(n-1)/2;
int*p,*i,*j;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{temp=*i;*i=*j;
*j=temp;}
}
②實參用指針變數,形參用數組名
#include<stdio.h>
voidinv4(intx[],intn);
voidmain()
{int*p,a[6]={1,3,4,6,7,9};
p=a;
inv4(p,6);
for(p=a;p<a+6;p++)
printf(「%3d」,*p);
printf(「 」);
}
voidinv4(intx[],intn)
{inttemp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{j=n-1-i;temp=x[i];
x[i]=x[j];x[j]=temp;}
}
『捌』 c語言中用指針的好處有哪些
指針非常的好,它把相同的事物歸類,然後把事物做出標記,避免給相同的特點做變數。比如說你和你同學,你們兩個人都有心臟、肝、肺等器官,如果命名心臟1、心臟2這樣比較麻煩,這時如果用上指針,指向你說心臟時說的是你的心臟,指向你同學時說的是你同學的心臟,如果人非常的多,你不用指針,那麼命名心臟1、2、3、4、5.。。。那是非常的多的不必要的變數。我現在運用PLC和WINCC連接時有的時候就用指針。節省了通訊時間,省略了很多的變數。
『玖』 都說c語言指針功能強大,我怎麼體會不到呢
首先要明確C語言的用處
C語言現在在大多數IT行業里認為是非主流的,因為大多數IT行業是互聯網公司,多數用java等面向對象的語言,他們的重點不在速度不在效率。
但是實際上C語言只是在大家不熟悉的地方使用,比如windows和linux的內核,比如通信行業的流傳輸。這些基本上都是C語言在搞,因為java之中面向對象的語言無法滿足這些地方的效率,而只有C這類高效率的面向過程的語言才能滿足這類需求。
什麼是面向過程,通俗點講就是細節,一個人是由胳膊腿軀干頭組成的(java),血管和肌肉就是細節(c)。四肢的移動速度可以按秒計算,血液的流動怎麼按秒計算呢?
那為什麼C語言的效率高呢,最直接的表現就是指針。
你舉得例子a=b和*p=b是一樣的,這個沒問題,java一般都是a=b這么用,換算成指針就是*p=b。但是C語言大部分的賦值都不會考慮*p=b,為什麼,因為效率低,C語言一般是p=&b這么來寫,我不需要賦值,我只是搬運工,如果b這個結構體有1M這么大,那a=b相當於拷貝了1M的內存而p=&b只不過一個四位元組的內存操作而已,前者也許要耗費1ms,後者如果按位元組數來算的話 你可以想像效率提高了多少數量級。
更別說什麼回調函數啊,結構體里存指針比存整個結構體省內存啊之類的了。