中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

搜狗seo查詢seo頁面優(yōu)化公司

搜狗seo查詢,seo頁面優(yōu)化公司,成都網站建設 erp,wordpress怎么使用自己的模板本章介紹以下內容: 關鍵字:static 運算符:&、*(一元) 如何創(chuàng)建并初始化數組 指針(在已學過的基礎上)、指針和數組的關系 編寫處理數組的函數 二維數組 人們通常借助計算機完成統(tǒng)計每月的支出…

本章介紹以下內容:
關鍵字:static
運算符:&、*(一元)
如何創(chuàng)建并初始化數組
指針(在已學過的基礎上)、指針和數組的關系
編寫處理數組的函數
二維數組
人們通常借助計算機完成統(tǒng)計每月的支出、日降雨量、季度銷售額等任務。企業(yè)借助計算機管理薪資、庫存和客戶交易記錄等。作為程序員,不可避免地要處理大量相關數據。通常,數組能高效便捷地處理這種數據。第?6?章簡單地介紹了數組,本章將進一步地學習如何使用數組,著重分析如何編寫處理數組的函數。這種函數把模塊化編程的優(yōu)勢應用到數組。通過本章的學習,你將明白數組和指針關系密切。

10.1 數組

數組由數據類型相同的一系列元素組成

方括號中的數字表明數組中的元素個數。
要訪問數組中的元素,通過使用數組下標數(也稱為索引)表示數組中的各元素。數組元素的編號從0開始,所以candy[0]表示candy數組的第1個元素

10.1.1 初始化數組

如上所示,用以逗號分隔的值列表(用花括號括起來)來初始化數組,各值之間用逗號分隔。在逗號和值之間可以使用空格。

使用數組前必須先初始化它。與普通變量類似,在使用數組元素之前,必須先給它們賦初值。編譯器使用的值是內存相應位置上的現有值,

當初始化列表中的值少于數組元素個數時,編譯器會把剩余的元素都初始化為0。也就是說,如果不初始化數組,數組元素和未初始化的普通變量一樣,其中儲存的都是垃圾值;但是,如果部分初始化數組,剩余的元素就會被初始化為0。

如果初始化數組時省略方括號中的數字,編譯器會根據初始化列表中的項數來確定數組的大小。

整個數組的大小除以單個元素的大小就是數組元素的個數

10.1.2 指定初始化器(C99)

而C99規(guī)定,可以在初始化列表中使用帶方括號的下標指明待初始化的元素:
int arr[6] = {[5] = 212}; // 把arr[5]初始化為212
對于一般的初始化,在初始化一個元素后,未初始化的元素都會被設置為0。

第一,如果指定初始化器后面有更多的值,如該例中的初始化列表中的片段:[4] = 31,30,31,那么后面這些值將被用于初始化指定元素后面的元素。也就是說,在days[4]被初始化為31后,days[5]和days[6]將分別被初始化為30和31。第二,如果再次初始化指定的元素,那么最后的初始化將會取代之前的初始化。

編譯器會把數組的大小設置為足夠裝得下初始化的值。

10.1.3 給數組元素賦值

聲明數組后,可以借助數組下標(或索引)給數組元素賦值。

C 不允許把數組作為一個單元賦給另一個數組,除初始化以外也不允許使用花括號列表的形式賦值。

10.1.4 數組邊界

10.1.5 指定數組的大小

在C99標準之前,聲明數組時只能在方括號中使用整型常量表達式。所謂整型常量表達式,是由整型常量構成的表達式。sizeof表達式被視為整型常量,但是(與C++不同)const值不是。另外,表達式的值必須大于0:

10.2 多維數組

在計算機內部,這樣的數組是按順序儲存的,從第1個內含12個元素的數組開始,然后是第2個內含12個元素的數組,以此類推。

10.2.1 初始化二維數組

如果第1個列表中只有10個數,則只會初始化數組第1行的前10個元素,而最后兩個元素將被默認初始化為0。如果某列表中的數值個數超出了數組每行的元素個數,則會出錯,但是這并不會影響其他行的初始化。

初始化時也可省略內部的花括號,只保留最外面的一對花括號。只要保證初始化的數值個數正確,初始化的效果與上面相同。但是如果初始化的數值不夠,則按照先后順序逐行初始化,直到用完所有的值。后面沒有值初始化的元素被統(tǒng)一初始化為0。

10.2.2 其他多維數組

通常,處理三維數組要使用3重嵌套循環(huán),處理四維數組要使用4重嵌套循環(huán)。對于其他多維數組,以此類推。

10.3 指針和數組

數組名是數組首元素的地址。也就是說,如果flizny是一個數組,下面的語句成立:
flizny == &flizny[0]; // 數組名是該數組首元素的地址
flizny 和&flizny[0]都表示數組首元素的內存地址(&是地址運算符)。兩者都是常量,在程序的運行過程中,不會改變。但是,可以把它們賦值給指針變量,然后可以修改指針變量的值,

我們的系統(tǒng)中,地址按字節(jié)編址,short類型占用2字節(jié),double類型占用8字節(jié)。在C中,指針加1指的是增加一個存儲單元。對數組而言,這意味著把加1后的地址是下一個元素的地址,而不是下一個字節(jié)的地址(見圖10.3)。這是為什么必須聲明指針所指向對象類型的原因之一。只知道地址不夠,因為計算機要知道儲存對象需要多少字節(jié)(即使指針指向的是標量變量,也要知道變量的類型,否則*pt 就無法正確地取回地址上的值)。

在指針前面使用*運算符可以得到該指針所指向對象的值。
指針加1,指針的值遞增它所指向類型的大小(以字節(jié)為單位)。

也就是說,定義ar[n]的意思是*(ar + n)??梢哉J為*(ar + n)的意思是“到內存的ar位置,然后移動n個單元,檢索儲存在那里的值”。

10.4 函數、數組和指針

關于函數的形參,還有一點要注意。只有在函數原型或函數定義頭中,才可以用int ar[]代替int * ar:
int sum (int ar[], int n);
int *ar形式和int ar[]形式都表示ar是一個指向int的指針。但是,int ar[]只能用于聲明形式參數。第2種形式(int ar[])提醒讀者指針ar指向的不僅僅一個int類型值,還是一個int類型數組的元素。

由于函數原型可以省略參數名,所以下面4種原型都是等價的:
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);
但是,在函數定義中不能省略參數名。下面兩種形式的函數定義等價:
int sum(int *ar, int n)
{
// 其他代碼已省略
}
int sum(int ar[], int n);
{
//其他代碼已省略
}

10.4.1 使用指針形參

指針start開始指向marbles數組的首元素,所以賦值表達式total += *start把首元素(20)加給total。然后,表達式start++遞增指針變量start,使其指向數組的下一個元素。因為start是指向int的指針,start遞增1相當于其值遞增int類型的大小。

而sump()函數則使用第2個指針來結束循環(huán):
while (start < end)
因為while循環(huán)的測試條件是一個不相等的關系,所以循環(huán)最后處理的一個元素是end所指向位置的前一個元素。這意味著end指向的位置實際上在數組最后一個元素的后面

10.4.2 指針表示法和數組表示法

使用數組表示法,讓函數是處理數組的這一意圖更加明顯。

但是,只有當ar是指針變量時,才能使用ar++這樣的表達式。
指針表示法(尤其與遞增運算符一起使用時)更接近機器語言,因此一些編譯器在編譯時能生成效率更高的代碼。然而,許多程序員認為他們的主要任務是確保代碼正確、邏輯清晰,而代碼優(yōu)化應該留給編譯器去做。

10.5 指針操作

如果編譯器不支持%p 轉換說明,可以用%u 或%lu 代替%p;如果編譯器不支持用%td轉換說明打印地址的差值,可以用%d或%ld來代替。

下面分別描述了指針變量的基本操作。
賦值:可以把地址賦給指針。例如,用數組名、帶地址運算符(&)的變量名、另一個指針進行賦值。在該例中,把urn數組的首地址賦給了ptr1,該地址的編號恰好是0x7fff5fbff8d0。變量ptr2獲得數組urn的第3個元素(urn[2])的地址。注意,地址應該和指針類型兼容。也就是說,不能把double類型的地址賦給指向int的指針,至少要避免不明智的類型轉換。C99/C11已經強制不允許這樣做。
解引用:*運算符給出指針指向地址上儲存的值。因此,*ptr1的初值是100,該值儲存在編號為0x7fff5fbff8d0的地址上。
取址:和所有變量一樣,指針變量也有自己的地址和值。對指針而言,&運算符給出指針本身的地址。本例中,ptr1 儲存在內存編號為 0x7fff5fbff8c8 的地址上,該存儲單元儲存的內容是0x7fff5fbff8d0,即urn的地址。因此&ptr1是指向ptr1的指針,而ptr1是指向utn[0]的指針。
指針與整數相加:可以使用+運算符把指針與整數相加,或整數與指針相加。無論哪種情況,整數都會和指針所指向類型的大小(以字節(jié)為單位)相乘,然后把結果與初始地址相加。因此ptr1 +4與&urn[4]等價。如果相加的結果超出了初始指針指向的數組范圍,計算結果則是未定義的。除非正好超過數組末尾第一個位置,C保證該指針有效。
遞增指針:遞增指向數組元素的指針可以讓該指針移動至數組的下一個元素。因此,ptr1++相當于把ptr1的值加上4(我們的系統(tǒng)中int為4字節(jié)),ptr1指向urn[1](見圖10.4,該圖中使用了簡化的地址)?,F在ptr1的值是0x7fff5fbff8d4(數組的下一個元素的地址),*ptr的值為200(即urn[1]的值)。注意,ptr1本身的地址仍是 0x7fff5fbff8c8。畢竟,變量不會因為值發(fā)生變化就移動位置。

圖10.4 遞增指向int的指針

指針減去一個整數:可以使用-運算符從一個指針中減去一個整數。指針必須是第1個運算對象,整數是第 2 個運算對象。該整數將乘以指針指向類型的大小(以字節(jié)為單位),然后用初始地址減去乘積。所以ptr3 - 2與&urn[2]等價,因為ptr3指向的是&arn[4]。如果相減的結果超出了初始指針所指向數組的范圍,計算結果則是未定義的。除非正好超過數組末尾第一個位置,C保證該指針有效。
遞減指針:當然,除了遞增指針還可以遞減指針。在本例中,遞減ptr3使其指向數組的第2個元素而不是第3個元素。前綴或后綴的遞增和遞減運算符都可以使用。注意,在重置ptr1和ptr2前,它們都指向相同的元素urn[1]。
指針求差:可以計算兩個指針的差值。通常,求差的兩個指針分別指向同一個數組的不同元素,通過計算求出兩元素之間的距離。差值的單位與數組類型的單位相同。例如,程序清單10.13的輸出中,ptr2 - ptr1得2,意思是這兩個指針所指向的兩個元素相隔兩個int,而不是2字節(jié)。只要兩個指針都指向相同的數組(或者其中一個指針指向數組后面的第 1 個地址),C 都能保證相減運算有效。如果指向兩個不同數組的指針進行求差運算可能會得出一個值,或者導致運行時錯誤。
比較:使用關系運算符可以比較兩個指針的值,前提是兩個指針都指向相同類型的對象。
注意,這里的減法有兩種。可以用一個指針減去另一個指針得到一個整數,或者用一個指針減去一個整數得到另一個指針。
在遞增或遞減指針時還要注意一些問題。編譯器不會檢查指針是否仍指向數組元素。C 只能保證指向數組任意元素的指針和指向數組后面第 1 個位置的指針有效。但是,如果遞增或遞減一個指針后超出了這個范圍,則是未定義的。另外,可以解引用指向數組任意元素的指針。但是,即使指針指向數組后面一個位置是有效的,也能解引用這樣的越界指針。

10.6 保護數組中的數據

10.6.1 對形式參數使用const

如果函數的意圖不是修改數組中的數據內容,那么在函數原型和函數定義中聲明形式參數時應使用關鍵字const。例如,sum()函數的原型和定義如下:
int sum(const int ar[], int n); /* 函數原型 */
int sum(const int ar[], int n) /* 函數定義 */
{
int i;
int total = 0;
for( i = 0; i < n; i++)
total += ar[i];
return total;
}
以上代碼中的const告訴編譯器,該函數不能修改ar指向的數組中的內容。如果在函數中不小心使用類似ar[i]++的表達式,編譯器會捕獲這個錯誤,并生成一條錯誤信息。

一般而言,如果編寫的函數需要修改數組,在聲明數組形參時則不使用const;如果編寫的函數不用修改數組,那么在聲明數組形參時最好使用const。

10.6.2 const的其他內容

如果程序稍后嘗試改變數組元素的值,編譯器將生成一個編譯期錯誤消息:

無論是使用指針表示法還是數組表示法,都不允許使用pd修改它所指向數據的值。但是要注意,因為rates并未被聲明為const,所以仍然可以通過rates修改元素的值。另外,可以讓pd指向別處:

關于指針賦值和const需要注意一些規(guī)則。首先,把const數據或非const數據的地址初始化為指向const的指針或為其賦值是合法的

然而,只能把非const數據的地址賦給普通指針

const還有其他的用法。例如,可以聲明并初始化一個不能指向別處的指針,關鍵是const的位置:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates; // pc指向數組的開始
pc = &rates[2]; ? ? ? // 不允許,因為該指針不能指向別處
*pc = 92.99; ? ? ? ?// 沒問題 -- 更改rates[0]的值
可以用這種指針修改它所指向的值,但是它只能指向初始化時設置的地址。
最后,在創(chuàng)建指針時還可以使用const兩次,該指針既不能更改它所指向的地址,也不能修改指向地址上的值:double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * const pc = rates;
pc = &rates[2]; ?//不允許
*pc = 92.99; ? //不允許

10.7 指針和多維數組

因為zippo[0]是該數組首元素(zippo[0][0])的地址,所以*(zippo[0])表示儲存在zippo[0][0]上的值(即一個int類型的值)。與此類似,*zippo代表該數組首元素(zippo[0])的值,但是zippo[0]本身是一個int類型值的地址。該值的地址是&zippo[0][0],所以*zippo就是&zippo[0][0]。對兩個表達式應用解引用運算符表明,**zippo與*&zippo[0][0]等價,這相當于zippo[0][0],即一個int類型的值。簡而言之,zippo是地址的地址,必須解引用兩次才能獲得原始值。地址的地址或指針的指針是就是雙重間接(double indirection)的例子

要特別注意,與 zippo[2][1]等價的指針表示法是*(*(zippo+2) + 1)??瓷先ケ容^復雜,應最好能理解。下面列出了理解該表達式的思路:

?

圖10.5 數組的數組?

10.7.1 指向多維數組的指針

int (* pz)[2]; ?// pz指向一個內含兩個int類型值的數組

int * pax[2]; ? // pax是一個內含兩個指針元素的數組,每個元素都指向int的指針

系統(tǒng)不同,輸出的地址可能不同,但是地址之間的關系相同。如前所述,雖然pz是一個指針,不是數組名,但是也可以使用 pz[2][1]這樣的寫法??梢杂脭到M表示法或指針表示法來表示一個數組元素,既可以使用數組名,也可以使用指針名:

zippo[m][n] == *(*(zippo + m) + n)
pz[m][n] == *(*(pz + m) + n)

10.7.2 指針的兼容性

指針之間的賦值比數值類型之間的賦值要嚴格。例如,不用類型轉換就可以把 int 類型的值賦給double類型的變量,但是兩個類型的指針不能這樣做

10.7.3 函數和多維數組

一種方法是,利用for循環(huán)把處理一維數組的函數應用到二維數組的每一行。

可以這樣聲明函數的形參:
void somefunction( int (* pt)[4] );
另外,如果當且僅當pt是一個函數的形式參數時,可以這樣聲明:
void somefunction( int pt[][4] );

注意,下面的聲明不正確:
int sum2(int ar[][], int rows); // 錯誤的聲明

int sum2(int ar[][4], int rows); ?// 有效聲明

int sum2(int ar[3][4], int rows); // 有效聲明,但是3將被忽略

int sum2(arr3x4 ar, int rows); ? // 與下面的聲明相同
int sum2(int ar[3][4], int rows); ?// 與下面的聲明相同
int sum2(int ar[][4], int rows); ?// 標準形式

一般而言,聲明一個指向N維數組的指針時,只能省略最左邊方括號中的值:
int sum4d(int ar[][12][20][30], int rows);

10.8 變長數組(VLA)

鑒于此,C99新增了變長數組(variable-length array,VLA),允許使用變量表示數組的維度。如下所示:
int quarters = 4;
int regions = 5;
double sales[regions][quarters]; ?// 一個變長數組(VLA)

前面提到過,變長數組有一些限制。變長數組必須是自動存儲類別,這意味著無論在函數中聲明還是作為函數形參聲明,都不能使用static或extern存儲類別說明符(第12章介紹)。而且,不能在聲明中初始化它們。最終,C11把變長數組作為一個可選特性,而不是必須強制實現的特性。

注意前兩個形參(rows和cols)用作第3個形參二維數組ar的兩個維度。因為ar的聲明要使用rows和cols,所以在形參列表中必須在聲明ar之前先聲明這兩個形參。因此,下面的原型是錯誤的:
int sum2d(int ar[rows][cols], int rows, int cols); // 無效的順序

C99/C11標準規(guī)定,可以省略原型中的形參名,但是在這種情況下,必須用星號來代替省略的維度:
int sum2d(int, int, int ar[*][*]); // ar是一個變長數組(VLA),省略了維度形參名

需要注意的是,在函數定義的形參列表中聲明的變長數組并未實際創(chuàng)建數組。和傳統(tǒng)的語法類似,變長數組名實際上是一個指針。這說明帶變長數組形參的函數實際上是在原始數組中處理數組,因此可以修改傳入的數組。

C90標準不允許(也可能允許)。數組的大小必須是給定的整型常量表達式,可以是整型常量組合,如20、sizeof表達式或其他不是const的內容。由于C實現可以擴大整型常量表達式的范圍,所以可能會允許使用const,但是這種代碼可能無法移植。
C99/C11 標準允許在聲明變長數組時使用 const 變量。所以該數組的定義必須是聲明在塊中的自動存儲類別數組。
變長數組還允許動態(tài)內存分配,這說明可以在程序運行時指定數組的大小。普通 C數組都是靜態(tài)內存分配,即在編譯時確定數組的大小。由于數組大小是常量,所以編譯器在編譯時就知道了。第12章將詳細介紹動態(tài)內存分配

10.9 復合字面量

字面量是除符號常量外的常量。例如,5是int類型字面量, 81.3是double類型的字面量,'Y'是char類型的字面量,"elephant"是字符串字面量。

下面的復合字面量創(chuàng)建了一個和diva數組相同的匿名數組,也有兩個int類型的值:
(int [2]){10, 20} ? // 復合字面量
注意,去掉聲明中的數組名,留下的int [2]即是復合字面量的類型名。

初始化有數組名的數組時可以省略數組大小,復合字面量也可以省略大小,編譯器會自動計算數組當前的元素個數:
(int []){50, 20, 90} // 內含3個元素的復合字面量

因為復合字面量是匿名的,所以不能先創(chuàng)建然后再使用它,必須在創(chuàng)建的同時使用它。使用指針記錄地址就是一種用法。也就是說,可以這樣用:
int * pt1;
pt1 = (int [2]) {10, 20};

與有數組名的數組類似,復合字面量的類型名也代表首元素的地址,所以可以把它賦給指向int的指針。然后便可使用這個指針。例如,本例中*pt1是10,pt1[1]是20。

還可以把復合字面量作為實際參數傳遞給帶有匹配形式參數的函數

記住,復合字面量是提供只臨時需要的值的一種手段。復合字面量具有塊作用域(第12章將介紹相關內容),這意味著一旦離開定義復合字面量的塊,程序將無法保證該字面量是否存在。也就是說,復合字面量的定義在最內層的花括號中。

10.10 關鍵概念

10.11 本章小結

數組是一組數據類型相同的元素。數組元素按順序儲存在內存中,通過整數下標(或索引)可以訪問各元素。在C中,數組首元素的下標是0,所以對于內含n個元素的數組,其最后一個元素的下標是n-1。作為程序員,要確保使用有效的數組下標,因為編譯器和運行的程序都不會檢查下標的有效性。
聲明一個簡單的一維數組形式如下:
type?name?[?size?];
這里,type是數組中每個元素的數據類型,name是數組名,size是數組元素的個數。對于傳統(tǒng)的C數組,要求size是整型常量表達式。但是C99/C11允許使用整型非常量表達式。這種情況下的數組被稱為變長數組。
C把數組名解釋為該數組首元素的地址。換言之,數組名與指向該數組首元素的指針等價。概括地說,數組和指針的關系十分密切。如果ar是一個數組,那么表達式ar[i]和*(ar+i)等價。
對于?C?語言而言,不能把整個數組作為參數傳遞給函數,但是可以傳遞數組的地址。然后函數可以使用傳入的地址操控原始數組。如果函數沒有修改原始數組的意圖,應在聲明函數的形式參數時使用關鍵字const。在被調函數中可以使用數組表示法或指針表示法,無論用哪種表示法,實際上使用的都是指針變量。
指針加上一個整數或遞增指針,指針的值以所指向對象的大小為單位改變。也就是說,如果pd指向一個數組的8字節(jié)double類型值,那么pd加1意味著其值加8,以便它指向該數組的下一個元素。
二維數組即是數組的數組。例如,下面聲明了一個二維數組:
double?sales[5][12];
該數組名為sales,有5個元素(一維數組),每個元素都是一個內含12個double類型值的數組。第1個一維數組是sales[0],第2個一維數組是sales[1],以此類推,每個元素都是內含12個double類型值的數組。使用第2個下標可以訪問這些一維數組中的特定元素。例如,sales[2][5]是slaes[2]的第6個元素,而sales[2]是sales的第3個元素。
C?語言傳遞多維數組的傳統(tǒng)方法是把數組名(即數組的地址)傳遞給類型匹配的指針形參。聲明這樣的指針形參要指定所有的數組維度,除了第1個維度。傳遞的第1個維度通常作為第2個參數。例如,為了處理前面聲明的sales數組,函數原型和函數調用如下:
void?display(double?ar[][12],?int?rows);
...
display(sales,?5);
變長數組提供第2種語法,把數組維度作為參數傳遞。在這種情況下,對應函數原型和函數調用如下:
void?display(int?rows,?int?cols,?double?ar[rows][cols]);
...
display(5,?12,?sales);
雖然上述討論中使用的是int類型的數組和double類型的數組,其他類型的數組也是如此。然而,字符串有一些特殊的規(guī)則,這是由于其末尾的空字符所致。有了這個空字符,不用傳遞數組的大小,函數通過檢測字符串的末尾也知道在何處停止。我們將在第11章中詳細介紹。
?


?

http://m.risenshineclean.com/news/57959.html

相關文章:

  • 駐馬店哪里做網站河南網站建設哪個公司做得好
  • 哪個網站做外貿的淘寶搜索關鍵詞排名查詢工具
  • 如何加強企業(yè)網站建設 論文企業(yè)網站注冊域名的步驟
  • 瀏覽器有哪幾種鄭州seo優(yōu)化顧問阿亮
  • 內蒙古網站seo推廣服務公司
  • 做的好的c2c網站重慶高端seo
  • 網站開發(fā)產品經理招聘雞西seo
  • wordpress整站生成html網頁
  • 買了域名之后怎么做網站網絡推廣公司企業(yè)
  • 網站開發(fā)中網頁上傳今天的新聞發(fā)布會
  • 免費代理做企業(yè)網站重慶疫情最新情況
  • 論壇網站搭建網絡熱詞2022
  • wordpress 好評插件優(yōu)化設計六年級下冊數學答案
  • 推廣網站源碼百度網站制作
  • 組織建設情況怎么寫哈爾濱seo優(yōu)化軟件
  • 網站建設保教長沙seo優(yōu)化哪家好
  • 網站怎樣制作seo網站優(yōu)化方案摘要
  • 制作網站首頁的步驟永久開源的免費建站系統(tǒng)
  • 臺州做網站的公司有哪些公司電子商務平臺建設
  • 幫朋友做網站 知乎seo概念的理解
  • 怎樣查網站用什么程序做的今天頭條新聞100條
  • 自己的網站在哪里找線上推廣渠道
  • 怎么看網站源碼用什么做的營銷廣告文案
  • 怎么做視頻網站賺錢嗎長春網站提升排名
  • 怎樣做私人網站重慶今天剛剛發(fā)生的重大新聞
  • 自己做的網站怎么連接計算機網絡推廣策劃案
  • 替人做賭彩網站被判刑外鏈推廣軟件
  • php網站用到的知識紹興百度seo
  • 百度首頁網站的設計詞語搜索排行
  • 網站建設說課獲獎視頻seo優(yōu)化排名百度教程