" "和’ '的比较
" "视为字符串,且编译器在后面自动加上’\0’
''则视为单个字符,整型
1、本质区别
双引号里面的是字符串, 而单引号里面的代表字符。
2、输出区别
str = “a”输出的就是a这个字母;
str = ‘a’输出的测试65
3、底层区别
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。
#include <cstdio>
int main(){
char a[2] = "l" ;
char b = 'p' ;
printf("%s\n" , a);
printf("%c\n" , b);
return 0 ;
}
%p的打印
%p是打印地址(指针地址)的,是十六进制的形式,但是会全部打完,即有多少位打印多少位。
32位编译器的指针变量为4个字节(32位),64位编译器的指针变量为8个字节(64位)。
所以,在32位编译器下,使用%p打印指针变量,则会显示32位的地址(16进制的);在64位编译器下,使用%p打印指针变量,则会显示64位的地址(16进制的),左边空缺的会补0。
%x:无符号十六进制整数(字母小写,不像上面指针地址那样补零)
%X:无符号十六进制整数(字母大写,不像上面指针那样补零)
%x、%X和%p的相同点都是16进制,不同点是%p按编译器位数长短(32位/64位)输出地址,不够的补零
下图中指针形式为64位,即阿紫64位编译器下运行的
指针和数组
数组的第一个元素的地址就是指针
能接受指针作为参数的函数,也能接受数组作为参数,如下所示:
#include <stdio.h>
/* 函数声明 */
double getAverage(int *arr, int size);
int main ()
{
/* 带有 5 个元素的整型数组 */
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
/* 传递一个指向数组的指针作为参数 */
avg = getAverage( balance, 5 ) ;
/* 输出返回值 */
printf("Average value is: %f\n", avg );
return 0;
}
double getAverage(int *arr, int size)
{
int i, sum = 0;
double avg;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
avg = (double)sum / size;
return avg;
}
Average value is: 214.40000