當前位置:首頁 » 編程語言 » c語言nil
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言nil

發布時間: 2022-10-20 17:11:34

⑴ nil有什麼含義嗎

nil:指向oc中對象的空指針。

Nil:指向oc中類的空指針。

NULL:指向其他類型的空指針,如一個c類型的內存指針。

一、nil
給對象賦值時一般會使用object = nil,表示想把這個對象釋放掉;或者對象由於某種原因,經過多次release,於是對象引用計數器為0了,系統將這塊內存釋放掉,這個時候這個對象為nil,稱它為「空對象」。
二、Nil
nil和Nil在使用上是沒有嚴格限定的,也就是說凡是使用nil的地方都可以用Nil來代替,反之亦然。只不過從編程人員的規約中約定俗成地將nil表示一個空對象,Nil表示一個空類。
三、NULL
我們知道Object-C來源於C、支持於C,當然也有別於C。而NULL就是典型c語言的語法,它表示一個空指針。
類與對象的概念
類是對同一類事物高度的抽象,類中定義了這一類對象所應具有的靜態屬性(屬性)和動態屬性(方法)。對象是類的一個實例,是一個具體的事物;類與對象是抽象與具體的關系。類其實就是一種數據類型,它的變數就是對象。
類與類之間的關系——繼承關系
A是B
例如:學生與小學生 小學生也是學生,所以學生是小學生的父類,小學生是學生的子類。
oc與面向對象
對象是oc程序的核心。「萬事萬物皆對象」是程序中的核心思想。
類是用來創見同一類型的對象的模板,在一個類中定義了該類對象所具有的成員變數以及方法。
類可以看成是靜態屬性(實例變數)和動態屬性(方法)的集合體。
IOS SDK裡面提供了大量供編程人員使用的類,編程人員也可以定義自己的類。

⑵ C語言中,原碼,補碼和反碼怎麼換算

換算方法如下:

1、數在計算機中是以二進制形式表示的。

2、數分為有符號數和無符號數,原碼、反碼、補碼都是有符號定點數的表示方法。

3、一個有符號定點數的最高位為符號位,0是正,1是副;【原碼】就是這個數本身的二進制形式。

4、正數的【反碼】和補碼都是和原碼相同;負數的【反碼】是將其原碼除符號位之外的個位求反。

拓展資料

1、C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

2、盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。

⑶ nil和Nil及NULL的區別

1、NULL具有通用性

NULL其實就是CC++的用法,用來表示一個對象指針不指向任何對象,其值為0,當在對象指針為NULL的對象上調用方法或訪問成員變數時,會拋異常。

2、nil與Nil的表示對象不同

NIL-> Null-pointer to objective- c class

NIL特對於表示Object-C的Class類型對象為NULL,表示其對象指針不指向任何對象。

nil-> Null-pointer to objective- c object

nil特對於表示Object-C的除Class類型外的對象為NULL,表示其對象指針不指向任何對象。NSArray末用nil來表示結束。

因為在NSArray和NSDictionary中nil中有特殊的含義(表示列表結束),所以不能在集合中放入nil值。如要確實需要存儲一個表示「什麼都沒有」的值,可以使用NSNull類。



3、NSNull用在不能使用nil的場合

NSNull是一個類,它只有一個方法:+ (NSNull *) null;

[NSNull null]用來在NSArray和NSDictionary中加入非nil(表示列表結束)的空值. [NSNull null]是一個對象,用來表示空,他用在不能使用nil的場合。

(3)c語言nil擴展閱讀:

nil與Nil可以簡單的理解為Object-C自己搞的對objective- c的NULL表示,用來表示一個對象指針不指向任何對象。

但是當在對象指針為nil或NIL的對象上調用方法或訪問成員變數時,返回NO,不會拋異常,程序將繼續執行下去。

發給nil對象的消息返回值取決於其方法的返回類型。如果返回方法返回某個指針類型(例如對象指針),則返回值是nil.表示安全地將消息傳遞給了nil對象-nil僅起著傳遞作用。如果返回方法是返回類型長度和指針類型相等或更小的int話,返回值是零。如果返回值是浮點類型或結構體的話,將得到某個未定義的結果。

⑷ 為什麼我打NIL,會出現undefined identifier,哪個頭文件包含NIL.

C里沒有這個關鍵字的,因為不同類型的變數聲明但沒賦值,他的值都是他內存里隨機的值,所以不可能一樣,有個共同的值,另外,NULL的定義是#define NULL 0就是說內存0的地址。所有類型的指針都可以指向這個地址。

另外你所指的NIL跟NULL不是同一個意思,所以不能像樓上說的那樣#define NIL NULL,那樣還定義個球啊直接用NULL就行。因為NULL是指地址為0,而你的NIL是指變數未初始化的隨機值,完全不是一樣的概念。

NIL是lua語言里用的關鍵字,如果你要在C里用的話,應該是NULL,如果你用的as,那應該是undefined。不曉得你用的是什麼語言

⑸ undefined是什麼意思

adj.未定義的;不明確的。

一、讀音:英[ˌʌndɪ'faɪnd];美[ˌʌndɪ'faɪnd]

二、例句:

The result of the call is undefined.

調用的結果是未定義的。

三、詞彙用法:

undefined是一個特殊值,通常用於指示變數尚未賦值。對未定義值的引用返回特殊值。其實大多數計算機語言,只有一個表示"無"的值,比如,C語言的NULL,Java語言的null,Python語言的None,Ruby語言的nil。



null與undefined

null的類型是一個對象,用來表示一個變數沒有任何數值,而undefined是指變數沒有定義任何值。

在JavaScript中,關鍵字null表示空值的意思,它表示對象為空,或者變數沒有引用任何對象。如果當一個變數的值為null,則表明它的值不是有效的對象、數組、數值、字元串和布爾型等。如果使用alert(typeof(null))來檢測null值的類型,則返回object,說明它是一個對象類型。

而undefined與null不同,它表示無值的意思,並且具有獨一無二的類型,它區別任何對象、數組、數值、字元串和布爾型。alert(typeof(undefined))的返回值為undefined。

⑹ xcode編程c語言,遇到問題exc bad access 網上說是什麼內存釋放的問題,但是

打開NSZombieEnabled來調試EXC_BAD_ACCESS
在寫iOS程序時,無論你是新手還是牛人,都有可能會碰到EXC_BAD_ACCESS。而此時你的debug area中不會顯示任何信息可以來幫助你找出問題。此時就需要打開NSZombieEnabled來提供更多有用的信息。
在XCode 4.2中,有兩種方法來打開NSZombie。
方法一,添加環境變數, 在菜單中,選擇Proct->Edit Schema, 選擇Run (App Name), 在Arguments下面的Environment Variables中,添加NSZombieEnabled, Value值為YES。
方法二,打開Diagnostics, 同樣在菜單中選擇Proct -> Edit Schema, 選擇Run (App Name), 在Diagnostics下,打開Memory Management下的Enable Zombie Objects.
此時,在運行程序,就會顯示哪個instance已經被release了,而你還向這個對象發消息。

當問題解決後,要將NSZombieEnabled設置為無效,不需要刪除變數,將變數前的對號去掉就可以了

以下為轉載內容 原文地址:http://www.cnblogs.com/shenyunjun420/archive/2011/08/04/2127464.html

第一次遇到 EXC_BAD_ACCESS , 然後程序崩潰,沒有任何調試信息
上網一查是這樣解釋的
向已經釋放的對象發送消息時會出現EXC_BAD_ACCESS。當出現錯誤時,通常會調用堆棧信息,特別是在多線程的情況下。
其實就是使用了野指針.

於是,我就按照教程(http://www.codza.com/how-to-debug-exc_bad_access-on-iphone) 在Xcode中打開executables
然後,打開信息面板中的Arguments面板
然後添加參數 NSZombiEnabled=YES, 這個參數值可以讓GDB在發現使用已經釋放的對象時給出一個有用信息
(Zombie 想起了植物大戰僵屍....)

再次運行,GDB給出了出錯消息 2011-01-11 01:00:00.299 VDic[342:20b] *** -[FMResultSet release]: message sent to deallocated instance 0x3d30f70
至此,我知道了是FMResultSet 釋放過度
但是是哪個地方釋放過度卻不甚清楚

於是把 objc_exception_throw 和 -[NSException raise] 加入了斷點列表
再次運行,發現錯誤定位到main函數...汗...這個還是太不精確了

為什麼main函數是錯誤位置呢? 我突然想到了main 函數里有個內存池來維護使用自動回收機制的對象
那麼錯誤定位到main 可能就是這個位置出了問題
int main(int argc, char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

進一步的回憶Fundation 框架的內存管理機制, 我很顯然是在某個地方release了本來應該自動回收的FMResultSet對象
這樣我就能夠定位一些位置了, 查找了下, 果然....

+ (NSMutableArray *) select: (NSString *) sql;
{
NSMutableArray *arr = [[NSMutableArray alloc] init];
FMResultSet *rs = [db executeQuery:sql];
while ([rs next]) {
[arr addObject:[rs resultDict]];
}

[rs close];
[rs release];
return arr;
}

rs是其它對象函數返回的結果,初始時引用計數為1,並被投入到自動釋放池中
而我畫蛇添足的release 則是一切災難的根源,阿門
去調此句果然運行通過了.

請大聲朗讀以下 Cocoa Fundation內存釋放原則

1. 通過分配或復制創建的對象保持計數1
2. 假設任何別的方法獲取的對象保持計數1,而且在自動釋放池中. 要想在當前執行范圍外使用該對象,就必須保持它
3. 向集合添加對象時它就被保持,從集合移除對象時就被釋放.釋放集合對象會釋放該集合中的所有對象
4. 確保有多少alloc,,mutableCopy或retain消息就有多少release或autorelease消息發送給該對象. 換句話說,確保你的代碼平衡
5. 在訪問方法設置屬性,先保持,再釋放 (ztime: 現在有@propperty , @synthesize 兩個指令自動創建此代碼)
6. 用@"..."結構創建的NSString對象是常量.發送release或retain並無效果

總體而言,Cocoa Fundation的內存管理還是非常簡單清晰的,
MS的COM對象生存期管理一樣是智能指針:)
對象釋放後通常要把指針設為nil

⑺ 關於nil和 null和NSNull的區別及相關問題

關於nil和 null和NSNull的區別及相關問題
1、nil和null從字面意思來理解比較簡單,nil是一個對象,而NULL是一個值,我的理解為nil是將對象設置為空,而null是將基本類型設置為空的,個人感覺有點像屬性當中,基本類型分配為assign NSString類型一般分配,而對象一般用retain。而且我們對於nil調用方法,不會產生crash或者拋出異常。
看一段

nil -> Null-pointer to objective- c object
NIL -> Null-pointer to objective- c class
null-> null pointer to primitive type or absence of data.
看一下用法
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一個對象指針為空,Nil是一個類指針為空,NULL是基本數據類型為空。這些可以理解為nil,Nil, NULL的區別吧。

2、NSNULL,NULL和nil在本質上應該是一樣的,NULL和nil其實就是0,但是在Objective-c中,對於像NSArray這樣的類型,nil或NULL不能做為加到其中的Object,如果定義了一個NSArray,為其分配了內存,又想設置其中的內容為空,則可以用[NSNULL null返回的對對象來初始化NSArray中的內容,我的感覺有點像C語言中malloc一個內存空間,然後用memset初始化這段空間里的值為0。

[cpp] view plain print?
_viewControllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < _pages; i++) {
[_viewControllers addObject:[NSNull null]];
}
ymBaseController *controller = [_viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
...
}
[_viewControllers replaceObjectAtIndex:page withObject:controller];

3、一個可以研究一下的問題
在dealloc中
-(void) dealloc
{
self.test = nil;
[_test release];
test = nil;
}
這幾個的區別
先說最簡單的 [_test release]; 這個就是將引用技術減1,所謂的引用計數就是看看有多個指針指向一塊內存實體,當release一次,就是指針減少一個,release到了0的時候,就是真正把這塊內存歸還給系統的時候了

再說self.test = nil;說明一下 屬性和setter和getter方法就不難理解了

-(void) setTest:(NSString *)newString
{
if(_test != newString)
[_test release];
_test = [newString retain];
}
-(NSString *)test
{
return _test;
}
這個是setter和getter方法,而在這個問題中相當於剛才的代碼改變為
if(_test != nil)
[_test release];
_test = nil;
現在就比較容易解釋了,setter方法會retain nil對象,在這之前已經先release了舊的對象,這個方法優點是成員變數連指向隨機數據的機會都沒有,而通過別的方式,就可能會出現指向隨機數據的情況。當release了之後,萬一有別的方法要用要存取它,如果它已經dealloc了,可能就會crash,而指向nil之後,就不會發生錯誤了。nil說白了就是計數器為0,這么說吧,當真正release一個對象的時候,NSLog是列印不了它指向的內存控制項的,而當nil的時候,是可以列印出來指向的一個內存空間。
那麼現在也不難解釋test = nil; 單純的這種用法可以說是自己給自己製造內存泄露,這里可以這么理解,就是相當於將指向對象的指針直接和對象一刀兩斷了。直接讓test指向nil,而內存實體不會消失,也不會有系統回收。

⑻ c語言中 #include<windos.h>文件頭除了能限制機器輸出時間,還有什麼用途

是windows.h吧。這個頭文件里有好多函數。你確定你都想知道么。
下面就是啦:
有關進程系統許可權類
1:函數OpenProcessToken(
HANDLE ProcessHandle,//進程的句柄
DWORD DesiredAccess,//對進程的訪問描述
PHANDLE TokenHandle//打開進程令牌的句柄指針
);
這個函數的作用是打開進程令牌
2: 函數LookupPrivilegeValue(
LPCTSTR lpSytemName,//系統名稱
LPCTSTR lpName,//特權名稱
PLUID lpluid//本地系統唯一的ID號
)
這個函數將返回一個本地系統內獨一無二的ID,來用於系統許可權的更改,它的第一個參數是系統名,nil表示本系統。第2個參數是特權的名字。第3個參數用來接收函數返回的ID。
3.函數AdjustTokenPrivileges(
HANDLE TokenHandle, //更改許可權的令牌環句柄
BOOL DisableAllPrivileges, //是否修改所有許可權的標志位
PTOKEN_PRIVILEGES NewState, //新的系統許可權信息
DWORD BufferLength, //上一個參數的長度
PTOKEN_PRIVILEGES PreviousState, // 返回更改系統特權以前的許可權
PDWORD ReturnLength //上一個參數的長度
);
這個函數用於更改進程的系統許可權 ,第1個參數是要更改許可權的令牌環句柄。第2個參數如果為true表示更改所有的系統許可權 ,false表示更改部分。第3個參數是要更改的系統特權的值。第4個參數是第3個參數的大小。第5個參數返回更改系統特權以前的許可權,我們不需要就設為nil。第6個參數是第5個參數的大小。

OpenProcess(
DWORD dwDesiredAccess,//訪問標志
BOOL bInheritHandle,//繼承句柄標志
DWORD dwProcessId //進程Id
)
這個函數用於修改我們宿主進程的一些屬性,這些屬性放在第一個參數裡面比如說PROCESS_VM_OPEARTION就是允許遠程VM操作,即允許VirtualProtectEx和WriteProcessMemory函數操作本進程內存空間。PROCESS_VM_WRITE就是允許遠程VM寫,即允許WriteProcessMemory函數訪問本進程的內存空間。第二個參數是一個標志參數,用來確定返回的句柄是否可以被新的進程繼承。我們的程序中設為False。第三個參數需要操作的進程Id,也就是我們的宿主進程的ID。
2:函數VirtualAllocEx(
HANDLE hProcess,//要進行操作的進程句柄,當然是我們的宿主了
LPVOID lpAddress,//分配空間的開始地址
DWORD dwSize,//分配空間的大小
DWORD flAllocationType,//分配空間的類型
DWOrd flProtect//訪問保護類型

我們使用VirtualAllocEx函數在宿主進程中開辟一塊內存空間,用於存放dll的文件名,VirtualAllocEx的第一參數是要操作的進程,第二個是開始地址,第三個是長度,第4,5個是操作參數。其中MEM_COMMIT表示本函數分配的物理內存或者是內存的頁面文件,PAGE_READWRITE表示分配的區域內允許讀寫
函數WriteProcessMemory(
HANDLE hProcess,//所要操作的線程的句柄
LPVOID lpBaseAddress,//開始進行操作的起始地址
LPVOID lpBuffer,//所要寫入的Bytes數
LPDWORD lpNuberofBytersWriteen//世紀寫入的Bytes數

) 前面的函數在宿主內存中創建號空間後,現在往裡面寫入dll的名稱,而我們的WriteProcessMemory函數就可以勝任這一項工作,WriteProcessMemory函數的第一個參數是需要往內存裡面寫入dd的進程句柄,第二個參數是 「要進行寫操作」的目標內存起始地址,第三個參數是 「需要被寫入的數據」的地址,第四個參數是准備要寫入的長度,第五個參數是實際操作中寫的長度,這個參數是被函數輸出的。到這里我們就已經能成功把dll的路徑名稱寫進了宿主的內存空間。
GetProcAddress(
HMODULE hMole, //dll模塊的句柄
LPCSTR lpProcName // 函數名稱
);
我們用這個函數主要想得到kernel32.dll中的函數LoadLibraryW的入口地址,所以
GetProcAddress(GetMoleHandle('Kernel32'), 'LoadLibraryW')就可以了,當然有些細節得符合程序編譯器的要求,VC下使用就要改成
GetProcAddress(GetMoleHandle(TEXT("Kernel32")), "LoadLibraryW")的形式。

CreateRemoteThread (
HANDLE hProcess, //要進行操作的進程句柄,也就是我們的宿主句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes, //線程安全屬性的指針
DWORD dwStackSize, //初始化堆(stack)的大小
LPTHREAD_START_ROUTINE lpStartAddress,//新建線程函數的指針,或叫做地址
LPVOID lpParameter, //新建線程函數的參數
DWORD dwCreationFlags, //標志位
LPDWORD lpThreadId //線程返回值
);
這個函數就是本文的點睛之筆了,我們之前所做所有的一切,都是在為它做准備工作,它的功能就是在其他任何進程中創建新的線程,讓其他的程序或進程附加執行我們的代碼。
CreateRemoteThread函數的第一個參數是要操作的宿主進程句柄;第二個參數為線程安全參數的指針,這里設為nil;第三個參數為初始化堆(stack)的大小,這里設0;第四個參數為新建線程函數的指針或叫做地址或叫入口;第五個參數為新建線程函數的參數,這里就是我們的dll路徑名稱;第六個參數是標志位,這里設0;第七個參數是線程返回值。