1、sizeof
某个类型或者某个变量在内存中占用字节数。
例如:sizeof(int) ; sizeof(i);都可以使用
2、运算符&
获取变量的地址。
int i;
scanf("%d",&i);
输入变量时,必须使用&运算符。
&操作符只能应用于变量,不能是常量和表达式。
定义一个数组int arr[5],数组的地址表示方式可以是:
arr,arr[0],&arr,三种方式都是正确的。
通过访问变量的地址,可以获取变量的值。
3、指针
指针就是保存地址的变量。
int main()
{
int i = 5;
int* p = &i;
printf("%p",p);
}
p是一个指针,指向int型。p的值是i的地址,可以说p指向了i。
普通变量的值是实际值,指针变量的值是其它变量的地址。
输出指针p时,使用的是%p,格式控制符“%p”中的p是pointer(指针)的缩写。指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值。
#include <stdio.h>
void f(int* p);
int main()
{
int i = 5;
int* p = &i;
f(p);
}
void f(int* p){
printf("%p",p);
}
访问指针存储的地址所对应的值,用*操作符。
#include <stdio.h>
void f(int* p);
int main()
{
int i = 5;
int* p = &i;
f(p);
//获取p存储的地址对应的值,即i的值
int m = *p;
printf("m = %d\n",m);
//修改p存储的地址对应的值,即i的值
*p = 10;
printf("i = %d",i);
}
//打印地址
void f(int* p){
printf("%p\n",p);
}
4、字符类型
#include <stdio.h>
int main()
{
int i = 5;
int c = '8';
printf("i = %d\n",i);
printf("c = %c\n",c); //c以字符形式输出
printf("c = %d\n",c); //c以整数形式输出
}
从结果可以看出,在计算机中用56表示字符8,即‘8’。
每个字符在计算机中都有一个整数值表示。
输入字符8,既可以输入int型56,也可以是char型8
#include <stdio.h>
int main()
{
char m;
scanf("%c",&m);
printf("m(整数) = %d\n",m);
printf("m(字符) = %c\n",m); //m以字符形式输出
}
输入5是字符格式,所以输出 字符格式是5,输出整数格式是53,即字符5在计算机中是以53存储的。字符5的ascII码值是53。
#include <stdio.h>
int main()
{
if(53 == '5'){
printf("相等");
}
}
通过代码验证字符5和53确实相等。
所以字符有两种表现形式,一种是字符形式,一种是ascII码。
字母在ASCII码表中顺序排列。
'a'-'A'得到两段之间的距离。
字符+'a'-'A' 从大写转小写
字符-('a'-'A' ) 从小写转大写
转义字符:
字符数组:
char word[] = {'H','e','l','l','o','!'}; //这不是字符串,因为不能不能用字符串的方式计算。
这个word只是字符数组。不是字符串。
char word[] = {'H','e','l','l','o','!',‘\0’}; //这是字符串,因为添加了'\0'。
这个word是字符数组,也是字符串。
字符串变量:
数组和指针可以转换,所以有第一种形式。
第二和第三种形式,编译器会自动添加结束标记'\0',所以第二种形式,字符数组的长度是6,字符串的长度是5;第三种形式字符串长度是5,但占用6个字节的空间。结束标记占用一个字节,但不是字符串的长度。
字符串常量:
字符串常量:
字符串常量"hello,world!"存放在一个只读的地方,不能写入,所以不能修改。
#include <stdio.h>
int main()
{
int i = 5;
char* p1 ="hello world!";
char* p2 = "hello world!";
printf("i的地址是:%p\n",&i);
printf("p1的值是:%p\n",p1);
printf("p2的值是:%p\n",p2);
}
两个字符串常量内容相同,所以存在一个地方。
p1和p2两个指针存储的都是“hello world!"的地址,结果显示相同。所以并不是用两个空间存储两个相同的字符串。
当添加了修改字符数组第一个元素的值,结果就不输出,因为常量无法修改。
原理是:“hello world!"字符串常量是只读的,但存储在字符数组中需要将“hello world!"拷贝之后存储在字符数组中,所以可以在数组中修改。因为此时修改的是字符数组中的值,不是常量值。
添加字符数组p3,内容依然相同,打印3个相同字符串的地址:
发现p1和p2是相同的,而p3是不同的,p3和i的地址很接近,和p1,p2却相差很远。常量存在一个地方,不可以修改,变量存在一个地方,可以修改。i和p3是变量。
字符串定义,何时用字符数组,何时用指针呢?
char* 是字符数组?