C 查漏补缺(二)

版权声明:不积跬步无以至千里,愿与君共勉! https://blog.csdn.net/Crazy_Tengt/article/details/80867678
  • volatile(专一王子)
    • 它修饰的变量表示该变量的值很容易由于外部因素发改变,强烈请求编译器要老老实实地在每次对变量进行访问时去内存里读取。
  • typedef和#define
    • typedef是为一个新类型起新名字,有类型检查
    • #define只是简单的字符串替换,无类型检查
    • 前者在编译的时候处理,后者在预编译(预处理)的时候处理
typedef char * p_str1;
#define p_str2 char *
p_str1 s1, s2;//s1,s2是char*
p_str2 s3, s4;//s3是char*,s4是char
typedef char * p_str;
char string[4] = "abc";
const char *p1 = string;
const p_str p2 = string;
p1++;
p2++;//错误 p_str 为自定义数据类型,如同 const int p2;
  • 浮点变量与零值比较
    • 不可将浮点变量用“==”或“!=”与任何数字比较,应该转化成“>=”或“<=”形式。
if ((x >= -EPSINON) && (x <= EPSINON))
//EPSINON是允许的误差(即精度)
若浮点型的精确度为8位,则小数点后8位都是准确的,若float x=0.0,则可取EPSINON=0.00000001
if (m_bool) if (!m_bool)布尔类型
if (0 == m_int) if (m_int != 0) 整型
if (NULL == m_ptr) if (m_ptr != NULL) 指针类型
  • 循环语句的效率
    • 应该将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
for (cool = 0; col < 5; col++)//短循环 
    {
        for (row = 0; row < 100; row++)//长循环 
        {
            sum = sum + a[row][col];
        }
    } 
  • 在32位平台里指针占了4个字节
  • *strings++
void printMany(char *strings[])
{
    while (*strings)
    {
        puts(*strings++);
    }
}
//* ++ 右结合性 相当于 *(strings++), strings++是使用完strings在++,所以  *string 然后 string++
  • array_name 和 &array_name 有什么不同
    • 前者是指向数组中第一个元素的指针,后者是指向整个数组的指针
void main()
{
    int a[5] = {1,2,3,4,5};
    int *ptr = (int *)(&a+1);//需要强制类型转换
    printf("%d, %d, %d, %d", *(a+1), *(ptr-1), a, &a);
}
//*(a+1) == 2, *(ptr-1) == 5
//&a 为指向整个数组的指针,&a+1 == &a[5],所以 ptr-1 即为&a[4]
//a == &a[0] == &a
//&a[0]+1 == a+1 != &a+1
int *(a[5]) 和 int *a[5] 都是有5个int型指针的数组
  • 常量指针和指针常量
const char *p;//常量指针,即指向一个常量的指针,指向的内容是常量,放在常量区的不可修改,但指针可以指向不同的地址。
char* const p = a;//指针常量,即指针本身是个常量不可修改,但指针指向的内容可以修改。
char *p = "abc";//"abc"是一个常量字符串,放在字符串常量区,p是一个指针变量,放在栈上;*p='b'即p[0]='b',编译时可以通过,但运行时会出现错误,试图改变常量区的内容
#include <stdio.h>

int main()
{
    char a[] = "ABCDE";
    char b[] = "abcde";
    char *p1 = "abcde";
    const char *p2 = "abcde";//p1 == p2 != b, p1 p2 指向同一块内存,b为字符数组 
    char * const p3 = p1;
    char * const p4 = a;
    printf("%d %d %d\n", b, p1, p2);
    *p1 = 'A';//编译通过,运行错误,试图修改常量区的内容
    *p2 = 'A';//编译不能通过,p2为常量指针,指向字符串常量,内容不能改变
    p2 = a;//可以
    p3 = 'A';//编译可以通过,运行错误
    p3 = a;//不可以,p3指针不能被改变
    p4 = 'A';//编译运行都能通过 

    return 0;
}
阅读更多

没有更多推荐了,返回首页