-
1、左移n位,就是乘以2的n次方查看全部
-
while{p!=null} printf{%d/n,%d/n,price,atk};p=p>-next;
查看全部 -
結(jié)構(gòu)體三種表達(dá)方法,這個(gè)最好用。
查看全部 -
9717@6他說(shuō)我是6小-查看全部
-
- &、|、^、~、<<丶>>邏輯運(yùn)算符。
查看全部 -
vim helloword.c
#include<stdio.h>
#definr R 10 ? ? //R就是宏,結(jié)尾不用分號(hào)隔開(kāi)。
int main()
{
int a = R;
printf("%d\n",a);
printf("helloworld\n");
return 0 ;
?}
編譯程序:gcc helloworld.c
查看運(yùn)行效果:./a.out
結(jié)果為:a=10
?????????????? helloworld
查看預(yù)處理之后的文件:gcc -0 helloworld.i helloworld.c -e
回車(chē)
gcc -o helloworld.i helloworld.c -E
vi helloworld.i
宏不考慮語(yǔ)法
查看全部 -
----------------------------------------------------------
-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?靜態(tài)鏈表????????????????????????????? ? ?-
----------------------------------------------------------
#include <stdio.h>
#include <string.h>
struct weapon{
? ? int price;
? ? char atk[20];
? ? struct weapon * next;
}wea1,wea2,wea3,wea4,*head;
void main(){
? ? // 賦值
? ? wea1.price = 100;
? ? strcpy(wea1.atk,"AWM");
? ? wea2.price = 200;
? ? strcpy(wea2.atk,"sass");
? ? wea3.price = 300;
? ? strcpy(wea3.atk,"98K");
? ? wea4.price = 400;
? ? strcpy(wea4.atk,"AK-47");
? ? //設(shè)置指針
? ? wea1.next = &wea2;
? ? wea2.next = &wea3;
? ? wea3.next = &wea4;
? ? wea4.next = NULL;
? ? //頭指針指向wea1
? ? head = &wea1;
? ? //通過(guò)指針打印 weapon 變量
? ? struct weapon * p;
? ? p = head;
? ? while(p!=NULL){
? ? ? ? printf("%d , %s\n",p->price,p->atk);
p = p->next;
? ? }
? ? printf("output wea1 is :%s;output &wea1 is :%s\n",wea1,&wea1);
? ? printf("%s\n",&wea1.atk);?
}
----------------------------------------------------------
-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?執(zhí)行結(jié)果? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -
----------------------------------------------------------
100 , AWM
200 , sass
300 , 98K
400 , AK-47
output wea1 is :d;output &wea1 is :d
AWM
查看全部 -
.c文件? --> .i文件? --> .s文件? --> .o文件? --> 可執(zhí)行文件
? ? ? ?預(yù)處理? ? ? ?編譯? ? ? ? 匯編? ? ? ? 鏈接? ??
--在預(yù)處理階段除了展開(kāi)頭文件,其次就是進(jìn)行宏替換
#define R 3.14
...
float a = R
...
宏替換后:..a=3.14 ...(宏的本質(zhì)就是單純的發(fā)生在預(yù)處理階段的字符串替換==> 即,宏不考慮語(yǔ)法,就是單純的字符串替換!??!)
# 看一下在預(yù)處理中程序做了什么事情:語(yǔ)句代表將 helloworld.c 文件進(jìn)行預(yù)處理,然后結(jié)果輸出到 .i 文件中去
gcc -o helloworld.i helloworld.c -E
# -E 表示只讓 gcc 進(jìn)行預(yù)處理?
# -o <文件>? 輸出到 <文件>。
查看全部 -
#include <stdio.h>
//這個(gè)宏脫離了傳參類型的限制,類似 Java 中的泛型;傳入兩個(gè)參數(shù),對(duì)其進(jìn)行加法運(yùn)算。
#define ADD(a,b) (a+b)
??
//結(jié)構(gòu)體變量定義、初始化和引用的過(guò)程
struct weapon{
? ? char name[20];
? ? int atk;
? ? float price;
}weapon_1;
struct{
? ? char name[20];
? ? int age;
}people;
//共用體
//union 所有成員共享一塊內(nèi)存地址
union data{
? ? int aa;
? ? char bb;
? ? float cc;
};
//相同結(jié)構(gòu)的 結(jié)構(gòu)體 和 公共體,打印他們的大小,看其占用內(nèi)存空間的規(guī)則
struct data_str{
? ? int aaa;
? ? char bbb;
? ? float ccc;
};
int main(){
? ? // 定義結(jié)構(gòu)體變量的同時(shí)賦值
? ? struct weapon weapon_2={"ak-47",10,9.9};
? ? //已經(jīng)定義好的結(jié)構(gòu)體變量賦值
? ? weapon_1.name[0]='A';
? ? weapon_1.name[1]='W';
? ? weapon_1.name[2]='M';
? ? weapon_1.atk=20;
? ? weapon_1.price=19.9;
? ? //結(jié)構(gòu)體數(shù)組
? ? struct weapon weapon_3[2] = {
? ? ? ? ? ? {"java",30,18.8},
? ? ? ? ? ? {"php",40,29.9}
? ? };
? ? //沒(méi)有結(jié)構(gòu)體名的結(jié)構(gòu)體
? ? people.age=18;
? ? //結(jié)構(gòu)體指針
? ? struct weapon * w2;
? ? w2 = &weapon_2;
? ? //結(jié)構(gòu)體數(shù)組指針
? ? struct weapon * w1;
? ? w1=weapon_3;
? ? //共用體
? ? union data data_union;
? ? printf("weapon_1: %s,%d,%f\n",weapon_1.name,weapon_1.atk,weapon_1.price);
? ? printf("weapon_2:%s,%d,%f\n",weapon_2.name,weapon_2.atk,weapon_2.price);
? ? printf("wwapon_3: %s,%s\n",weapon_3[0].name,weapon_3[1].name);
? ? printf("people.age is %d\n",people.age);
? ? printf("w1[0] is : %s\n",w1->name);
? ? w1++;
? ? printf("w1[1] is : %s\n",w1->name);
? ? //結(jié)構(gòu)體指針,加括號(hào)是因?yàn)辄c(diǎn)的優(yōu)先級(jí)高于星的優(yōu)先級(jí)。一樣的結(jié)果
? ? printf("w2 is : %s,%s\n",(*w2).name,w2->name);
? ? //共用體(聯(lián)合? --->? ?打印發(fā)現(xiàn)地址都是一樣的(data_union.a:0xffffc4694d50)
? ? //表示按十六進(jìn)制輸出數(shù)據(jù),如果輸出數(shù)據(jù)不夠8位數(shù),則左邊補(bǔ)0
? ? printf("data_union.a:%p,\ndata_union.b:%p,\ndata_union.c:%p\n",&data_union.aa,&data_union.bb,&data_union.cc);
? ? //%u表示無(wú)符號(hào)10進(jìn)制整型,
? ? //%lu表示輸出無(wú)符號(hào)長(zhǎng)整型整數(shù)
? ? printf("data_union size is :%lu\n",sizeof(data_union));
? ? printf("data struct size is :%lu\n",sizeof(struct data_str));
? ? return 0;
}
------------------------------執(zhí)行結(jié)果------------------------------------
weapon_1: AWM,20,19.900000
weapon_2:ak-47,10,9.900000
wwapon_3: java,php
people.age is 18
w1[0] is : java
w1[1] is : php
w2 is : ak-47,ak-47
data_union.a:0xffffe228b730,
data_union.b:0xffffe228b730,
data_union.c:0xffffe228b730
data_union size is :4
data struct size is :12
查看全部 -
gcc helloworld.c 四個(gè)步驟
查看全部 -
gcc helloworld.c 四個(gè)步驟
查看全部 -
c語(yǔ)言結(jié)構(gòu)體
查看全部 -
向左右移動(dòng)n位就是乘除2的n次方查看全部
-
動(dòng)態(tài)鏈表 指針
struct npc *{
struct npc *head
int...}*a,*b,c,d;
a,b是指針,會(huì)指向某個(gè)地址。假設(shè)當(dāng)a指向d的地址、b指向c的地址,那么當(dāng)使用a->next=b時(shí),實(shí)際上是d地址的next指向了c。當(dāng)a,b用&取到其他地址時(shí),對(duì)已經(jīng)操作的d的next指向c沒(méi)有影響。也就是說(shuō)a,b兩個(gè)指針就是表層工具人。
初學(xué)者,暫時(shí)這么理解,發(fā)現(xiàn)錯(cuò)誤請(qǐng)指出,我及時(shí)改正。查看全部 -
左移運(yùn)算能夠?qū)崿F(xiàn)二倍乘法,比直接乘法要快得多。
int是定義的有符號(hào)數(shù),左移會(huì)導(dǎo)致符號(hào)位移出去,導(dǎo)致內(nèi)存溢出。
右移不會(huì)導(dǎo)致溢出,有符號(hào)數(shù)進(jìn)行右移的時(shí)候,頭部的0會(huì)保存,1會(huì)重新設(shè)置在頭部。
查看全部 -
異或:進(jìn)行定位翻轉(zhuǎn)(0變1,1變0)
查看全部 -
按位或:用于設(shè)定指定位(比如與ff相或,可以將低八位設(shè)置為1)
查看全部 -
按位與用法:清零,保留指定位置的數(shù)。
查看全部 -
malloc函數(shù)的使用要調(diào)用malloc.h的頭文件。
malloc函數(shù)后面的sizeof主要用于指示分配內(nèi)存的大小,由于malloc函數(shù)默認(rèn)返回void類型(無(wú)類型,一般用于無(wú)返回值的函數(shù)。)
create函數(shù)的創(chuàng)建如下所示:
查看全部 -
靜態(tài)數(shù)據(jù)結(jié)構(gòu):整型、浮點(diǎn)型、數(shù)組(內(nèi)存空間和里面的內(nèi)容是定義好的)
查看全部 -
鏈表由一個(gè)個(gè)節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都包含了數(shù)據(jù)和下一個(gè)節(jié)點(diǎn)的地址兩部分。
數(shù)組是連續(xù)的內(nèi)存空間,鏈表不一定連續(xù)。
上圖顯示如何設(shè)計(jì)并訪問(wèn)靜態(tài)鏈表。
其中p->atk和(*p).atk表達(dá)效果一致。
查看全部 -
定義了union類型之后,data里面的內(nèi)容都是占用的同一個(gè)內(nèi)存空間。
所以12行后,給a賦值之后,b其實(shí)就不起作用了。
共用體占用的內(nèi)存是所有元素當(dāng)中占用最長(zhǎng)的那個(gè)的內(nèi)存。
共用體幾個(gè)成員的地址都是一樣的。
結(jié)構(gòu)體的占用內(nèi)存,不是單純地將元素的內(nèi)存大小進(jìn)行累加(計(jì)算機(jī)將其內(nèi)存重新規(guī)劃了一下,提高了運(yùn)行效率,用空間換時(shí)間)。
首先判斷所有元素的偏移地址(相對(duì)結(jié)構(gòu)體第一個(gè)內(nèi)存地址的偏移量),a是0,b是4(a的內(nèi)存字節(jié)數(shù)),c是5(a和b相加)。之后看一下每個(gè)元素的偏移地址,是不是他們自身占用的字節(jié)數(shù)的整數(shù)倍,比如c的偏移量是5個(gè)字節(jié),占用了4個(gè)字節(jié),這個(gè)時(shí)候在c的前面加上3個(gè)字節(jié)的內(nèi)存補(bǔ)空,讓c的偏移量變成8個(gè)字節(jié),是4個(gè)字節(jié)的兩倍。
之后,還要判斷結(jié)構(gòu)體總體的內(nèi)存,是不是最大元素所占內(nèi)存的整數(shù)倍,如果不是就在結(jié)構(gòu)體最后補(bǔ)充字節(jié)數(shù),直到滿足要求。
%lu表示長(zhǎng)整型,sizeof()用于輸出內(nèi)存大小。
%p表示地址,后面接&xxx輸出內(nèi)存地址。
查看全部 -
15-17行定義并輸出結(jié)構(gòu)體變量的相關(guān)屬性(*w的()不能省略,因?yàn)?運(yùn)算符優(yōu)先級(jí)比*高)
可以用w->name來(lái)替換*w.name
24行定義的指針p->name指向weapon_2數(shù)組第一個(gè)元素?
26行的p++表示p已經(jīng)指向下一個(gè)元素。
查看全部 -
結(jié)構(gòu)體變量weapon_1通過(guò)第12行語(yǔ)句定義,可以通過(guò)第13行的.運(yùn)算符獲得相關(guān)的值。
第15行定義weapon_2數(shù)組,有兩個(gè)元素,每個(gè)元素都有結(jié)構(gòu)體里定義的三種屬性。(可以將每個(gè)成員的3個(gè)屬性分別用{}括起來(lái),方便看)
16行展示了如何調(diào)用結(jié)構(gòu)數(shù)組中每個(gè)成員的各種屬性。
查看全部 -
struct定義方式:
1. 定義類型 struct xx {};
2. 定義類型并聲明一個(gè)全局變量 struct xx {} xx_1;
3. 定義一個(gè)結(jié)構(gòu)體 struct {} xx_1;查看全部 -
typedef的作用:重命名變量數(shù)據(jù)類型
????語(yǔ)法:typedef [數(shù)據(jù)類型] [新的名字]
????eg.typedef int * pointer;//將int * 的數(shù)據(jù)類型命名為pointer
typedef VS define:
①預(yù)處理時(shí)define定義的宏會(huì)替換,但typedef定義的別名不會(huì)替換。
②作用域不同
③通常用于給自定義數(shù)據(jù)類型其別名
size_t : unsigned long的別名
查看全部 -
我們正常定義一個(gè)函數(shù)需要聲明參數(shù)類型,int a之類的,用宏定義函數(shù),就不用考慮c語(yǔ)法。
查看全部
舉報(bào)