1】C語言的邏輯運算符:
&& 邏輯與,|| 邏輯或 ;如 表達式1&&x<表達式2,如果表達式1爲假,則表達式2不會執行;因此在對於會改變變量的表達式中,要注意&&的判斷運行規則。
2】數組:
總字節數 = sizeof(數據類型)*元素個數
const int days[] = {31,28,31,30,31,30};
int index;
for(intdex=0;index<sizeof days/sizeof days[0];index++)
printf("Month %2d has %d days/n",index+1,days[index]);
3】多維數組:
對於多維數組的分析因採用分解的思想。
4】指針:
px + n 指針向地址大的方向移動n個數據
n 有多大?取決於px所指向的類型
px+n表示的實際位置的地址量是:(px)+sizeof(px的類型)*n
5】對於一個數組S[n],&s+1表示什麼意思?s+1表示什麼意思?
&s+1等價於一個數組指針 int *[] 即&s代表的還是一個地址與s的值是相同的,只不過它所表示的類型變了。
s+1等價一個指針 int * s代表
錯6】對一個數組賦初值,常量(define x 10) char s[x]=“abcd”;可行?變量 int x=1;char s[x]="abcd";非法的?
這裏就涉及到了一個預處理和編譯類型的問題,跟我們的編譯流程有關。define x 10 在預處理之前定義是常量;int x=1 在預處理之
後程序運行時加載的,而char s[x]="abcd" 初始化是在預處理的時候進行的,也就是說,當編譯器預處理的時候,要給s[x]指定分配
一份內存,而x的值還沒有指定,是一個隨即值,因此會產生錯誤。
7】賦初值與預處理的關係?
比如 int i=10; 將數據10放在一個rodata段裏,當程序加載到vm運行的時候,取出10給i;
int i;i=10;
8】指針變量與數組的指針(或叫數組名)存在本質的不同,指針變量是地址變量,而數組的指針(數組名)是地址常量。
9】初學者經常犯的一個毛病!!!
char *p;
strcpy(p,"Hello"); p必須先指向一段合法內存。
解決方法:p=malloc(10) (動態分配);或p=a[10];
10】int **pp;int *p;則**(pp+1)與 *(p+1)有什麼不同?
11】字符指針與字符串
在程序中,初始化字符指針是把內存中字符串的首地址賦予指針,另外當一個字符指針初始化爲指向一個字符串常量時,不能對字符指
針變量的目標賦值。
如:
1>char *ps="hello"; "hello"是字符串常量,表示只讀字符串。
2>char str[]="hello"; 將hello初始化到str[]中來,str[]是可變的。
因此,*ps='x'; 對於1>來說是錯誤的。對於2>來說是對的,等價與str[0]='x';
12】const 在c與c++中區別?
c 中 const定義一個只讀變量;
c++ 中 const定義一個常量(可以用const替代define);
在看下面的一些定義:
const int *p; p所指向的目標不可變,不能通過*p去修改p所指向的變量,變量本身是可以修改的;如:*p=4錯;x=4對;
我們可以這樣來理解,const修飾int,而下面的const修飾p。int const *p等同於const int *p
int *const p; 指針本身不可變,只讀的;因此在定義他的時候要對它初始化,否則以後不可變了。
對於const,給我們帶來了一定安全性的作用;比如:
func(const char *s)
保證了函數內部不會通過*s改變s所指向的值。
13】函數的參數傳遞:
函數與函數之間的數組傳遞,複製傳遞方式只是提供一種形式,被調用函數的形參數組的數組名實際上是一個指針變量,因此,複製
傳遞方式與數組的指針傳遞方式完全相同,只是形參的說明形式不同而已。
看下面一個例子:
void func(char str[])
{
printf("%d/r/n",sizeof(str));
}
int main()
{
char str[]="abcdefg";
printf("%d/r/n",sizeof(str));
func(str);
}
打印的結果是: 8
4
這就證實了函數參數傳遞的是一個指針,即使是數組,編譯器也會將它當成指針。
下面看下指針與數組的一些對比:
指針 數組
存放地址 存放數據
指向匿名內存 數組名
間接訪問 直接訪問
malloc動態內存 自動存儲
地址變量 地址常量
14】數組下標是否可以爲-1?
答案是肯定的;這裏我們要理清一個思路,數組的下標僅表示偏移量,設數組 double a[i];我們可以通過a[i]取得這個數組中的某個值,其實制是通過*(a+i)取得,因此如果在定義一個函數: 通過func(a)傳遞參數
func(double b[])
{
b++; 此時b指向的是a+1這個地址,即a[1]的值
b[-1]; 此時b[-1]相當與*(b-1),即a[0]的值
}
15】指針數組與數組指針
一個數組,若其元素均爲指針類型數據,稱爲指針數組,也就是說,指針數組中每一個元素都相當於一個指針變量。
16】指針函數與函數指針
函數指針是用來存放函數的地址,這個地址是一個函數的入口地址,而且是函數調用時使用的起始地址。
如:
int func(double) int (*pf) (double);
{ pf=func;
pf(double); 此時調用pf就相當與在調用func
}