内存:一块临时存储区域
虚拟内存 vm
物理内存 pm
内存单元:一个内存单元的大小是1byte
内存块:连续多个内存单元
内存地址:相当于是教室的门牌号
内存中的值:相当于是教室里面所存放的东西
int num = 0;
error:&&num:不要针对地址进行取址操作
&num:获取num所在内存的起始地址
num:内存中所存取的内容
error: *num:不能针对非地址值进行取值(对地址值取值(*ptr))
int* ptr = null;
error:&&ptr:不要针对地址进行取址操作
&ptr:获取ptr这个指针变量所在内存的起始地址
ptr:内存中所存取的内容(地址)
error: *ptr:获取指针变量的这个地址值对应的内存其所存储的内容
error:**ptr:通常也不能针对一个一级指针进行二次取值
int** q = &ptr;
浮点类型内存存储
alloca申请的内存在栈上
malloc calloc申请的内存在堆上
const int* n; //值不可变,地址可变
int* const n; //地址不可变,值可变
consr int* const n; //地址和值都不能改变
int main()
{const int num = 10;//值不可变int* ptr = (int*)&unm;*ptr = 1000;printf("%d\n",num);return 0;
}
======================================================
练习1:
以下程序输出结果
练习1:
以下程序输出结果void swap_1(int a, int b)
{int c;c = a;a = b;b = c;
}void swap_2(int& a, int &b)
{int c;c = a;a = b;b = c;
}int main()
{int a = 100;int b = 200;swap_1(a, b);printf("%d, %d", a, b); //100,200swap_2(a, b);printf("%d, %d", a, b);
}
练习3:
下面的函数实现在一个固定的数上加一个数,有什么错误?请改正。
int add_n ( int n )
{static int i = 100;i += n; //i不是一个固定值return i;
}
//i是一个静态局部变量,含义:当前的i只能初始化一次
当程序结束时,静态局部变量被释放
=======================================================
int main(int argc,char *argv[])
{int num = 10;printf("%d\n",add_n(num));//110printf("%d\n",add_n(num));//120printf("%d\n",add_n(num));130printf("%d\n",add_n(num));140
}
练习4:
写出下列程序的运行结果。
int a; //全局变量未初始化系统默认为0
int b;
int c;
void F1()
{ b=a*2; a=b;
}void F2()
{ c=a+1; a=c;
}int main()
{ a=5; // 如果int a = 5;打印结果为5,局部变量F1(); F2(); printf("a=%d/n",a); //11return 0;
}
练习5:
下面程序能否编译通过,如果不能请修改? 其运行结果是多少,为什么?
在64位没问题,在32位有问题
64位:
#includ <stdio.h>int main()
{unsigned long long a = 0xAAAAAAAABBBBBBBB;unsigned int b = 0xDDDDDDDD;printf("valuea:%lx, valueb:%lx\n", a, b);
}
//结果为:aaaaaaaabbbbbbbb,dddddddd
32位:
#includ <stdio.h>int main()
{unsigned long long a = 0xAAAAAAAABBBBBBBB; 8位unsigned int b = 0xDDDDDDDD;printf("valuea:%lx, valueb:%lx\n", a, b); 32位中:lx:4位,llx为8位,所以存在问题
}小端存储,所以结果为:bbbbbbbb,aaaaaaaa
原因:对于printf存在缓存区,printf相当于栈,参数从后往前入栈
//注意点:
1、输出缓存区是一个栈
2、函数参数入栈的顺序
3、printf输出时要严格按照前面的类型输出
练习6:
改错:
int main(void)
{int **p;//int arr[100];p = &arr;return 0;
}
//p中存放arr的地址时,*p为空,不能跨级操作
练习7:
char str1[] = "abc";
char str2[] = "abc";const char str3[] = "abc";
const char str4[] = "abc";const char *str5 = "abc";
const char *str6 = "abc";char *str7 = "abc";
char *str8 = "abc";printf("%d\n", str1 == str2);不相等,都在栈上
printf("%d\n", str3 == str4);不相等,const强调值不可变,地址不同
printf("%d\n", str5 == str6);
printf("%d\n", str7 == str8);