现在的位置: 首页 > 综合 > 正文

【Xcode学C-4】进制知识、位运算符、变量存储细节以及指针的知识点介绍

2017年03月21日 ⁄ 综合 ⁄ 共 2153字 ⁄ 字号 评论关闭

一、进制知识

(1)默认是十进制。八进制前面加0,即int num1=015;是13。十六进制前面加0x/0X,即int num1=0xd,结果是13。二进制前面是0b/0B,即int num1=0b1101,结果是13。

(2)输出可以是八进制、十进制、十六进制输出,分别是%o、%d、%x,但没有二进制格式直接输出。

(3)3位二进制位是0~7,三个3位二进制位就相当于八进制数据。如000001101(二进制的13),我们划分成三个一组000 001 101,再分别换算成十进制的就是0 1 5,这个015就是八进制的13。

(4)同上,二进制转换成十六进制就是4个一组划分再转换即可。

(5)重新补脑以下原码补码反码。计算机中存储的都是补码。正数的三码合一。负数三码各自过。如-13,则原码是1000 1101(最高位是1表示负数,是0表示正数),反码就是除了最高位的符号位不变外其余都取反则变成1111 0010,补码是在反码基础上加1,即加0000 0001,所以补码是1111 0011。

二、位运算符

(1)&按位与,只有两个都是1才返回1,即9&5=1,因为1001&0101=0001,所以是1。所以任何数按位与1,结果还是那个数。

(2)同理,| 按位或。有一个是1就返回1。

(3)异或^,相同返回0(即都是1或者都是0),不同返回1。多个整数按位异或时,顺序不影响最终结果。相同整数按位异或结果都是0,所以结果是0。任何整数按位异或上0,结果还是那个整数。

(4)取反~,就是把1变成0,0变成1。

(5)左移<<,9<<1就是把9的二进制位左移1位。往左边移动多少位,就是等于9*2^(位数),即左移1位结果9*2,左移2位结果是9*4……。但是左移有可能会改变数值的正负性,因为高位被舍弃,低位用0补齐了。使用场合:当需要计算某个数值*2的多少次方时。

(6)同理,右移就是除以2的几次方。


三、变量存储细节

(1)内存最小单位是字节,如果是一个int值需要用4个字节,那么内存分配地址的数值会从大到小分配,数值的最高位放在大地址中,放不下再逐个放在小地址中。并把最终最小的那个地址值作为整个数值的引用地址。

(2)类型修饰符之一改变取值范围。int是4个字节、short和long是2个和8个字节。如果int的值放不下数值,可以用long int=1234567898765L来书写,这句话意思就是强制改变int的字节数变成8个字节,这样就可以存储更大的数据。一般我们也会在对应的数值后面加上L或者小写的l。对应的格式化输出变成%ld,如果是short的话是%hd,是long long的话是%lld。

(3)类型修饰符之二符号。默认是signed,即正、负、0,范围是-2^(31)~2^(31)。unsigned只能赋值正数和0,取值范围是0~2^(32)。可以和上面修饰符混合使用。

(4)数组作为形参时候可以不写具体元素个数,如arr[]。数组的存储顺序和变量相反,从小地址开始放到大地址。

(5)二维数组。int ages[2][3]={{1,2,3},{4,5,6}};

(6)字符串本质上类似于字符数组,但是字符串存储最后位有一个\0,读取遇到\0就结束。strcat()是拼接两个字符串,strcpy(a,b,1)是把b拷贝到a里面,且只拷贝1个字符。strcmp(a,b,2)是比较两个字符串,相等返回0,前面大于后面返回正数,反之负数。升级版是strncmp(a,b,2),2表示只比较前2位字符。

(7)字符串数组相当于二维数组,char a[2][10]={"hhhhhh","kkkkkk"};。

四、指针

(1)指针变量是用*标识的,如int a=5; int *p=&a;p指针就是存放了一个a的地址,而直接使用*p=20;*p相当于访问p地址里的内存并把值修改为20,也就是此时a的值就是20。

//指针其实就是地址之间的传来传去&表示取到这个变量的地址。p指针本身就是地址变量,*p是直接访问这个地址指向的内存。
//清空指针用=NULL
void change(int *p){
    *p=80;
}

int main(int argc, const char * argv[]) {
    
    int num1=90;
    change(&num1);
    printf("%d\n",num1);
    
    return 0;
}

(2)**p表示指向指针的指针,如果要访问值则是**p。

(3)指针变量占用8个字节。为什么要给指针变量定义数据类型int。只是告诉指针在取值时候取多少个字节。

(4)指针和数组。如果int *p=&arr[0];那么*p就是数组的第一个值,*(p+1)就是第二个值,类推,此处+1,是加了指针类型变量所占用的字节数。

(5)数组名=数组地址,即arr=&arr[0];。

(6)定义一个指向函数的指针:调用是用(*p)();即可。但我们一般直接用p();来调用。

void change(){
    printf("jjj");
}

int main(int argc, const char * argv[]) {
    //以下两行是,相当于把函数名换成(*p),然后随后赋值一下即可
    void (*p)();
    p=change;
    
    return 0;
}

(7)可以把函数当做参数进行传递,在Java里称之为回调函数。

抱歉!评论已关闭.