float a[10],*ptr;
a[0] = 10.222;
ptr = &a[0];
printf("%d\n", a);//6422000
printf("%d\n", &a);//6422000
printf("%d\n", &a[0]);//6422000
printf("%d\n",ptr);//6422000
可以看出,声明数组后,a既是数组名,也是0号元素的地址。
所以可以这样访问元素:
printf("%f\n", *a);//10.222000
数组与指针虽然有相通之处,但是却并不能理解为同一个东西。
可以查看a的大小:
printf("%d\n", sizeof(a));//40
一个float是4,10个也就是40,可以看出,指的是数组的大小。
若是一个指针的话,大小应该为系统的位数,一般为8;
同样的,也可以用数组的方式访问指针指向的值:
printf("%f\n", ptr[0]);//10.222000
虽然允许这样做,但一般还是应该照原本的风格使用。
2.两个指针相减,可以得出它们差了多少位:
float a[10] = {11.1,22.2,33.3,44.4,55.5};
float *ptr1, *ptr2;
ptr1 = a;
ptr2 = a+2;
int p = ptr2 - ptr1;
printf("%d\n", p);//2
还可以进行比较,判断出谁前谁后:
int p;
if(ptr2 > ptr1)
{
p = 111;
}
printf("%d\n", p);//111
3.unsigned long类型用%lu输出。
unsigned long w = 5;
w += -2;
w += -6;
无符号型,若给它一个无符号数,可以正常输出。
但如果给它一个负数,则可能输出一个很大的值。
这是因处理类型时的规则所致。
4.取余符号(%)用于整型,这样会报错:
double x = 1.32;
int y = x % 3;
把y换成double也不行。
int x = -23;
int y = x % 3;//-2
如果x是个负数,那么余数也会以负数的形式输出。
5.
int k,a,b;
a += a -= (b=4) * (a=3);
这条语句从右往左算,第一步后,a=3,b=4,3x4=12。
6.
int num,sum;
num=sum=7;
sum=num++,sum++,++num;//8
sum=(num++,sum++,++num);//9
加()后用最后一个子表达式的值作为最终值。
7.在C语言中,不同类型的数据在内存中存储的形式主要是原码、补码或浮点表示法。具体取决于数据类型:
1.char
?类型:字符的存储方式可以是原码形式,表示字符的ASCII码值。如果?char
?被用作存储数值(特别是在处理有符号?char
?时),那么这些数值通常以补码形式存储。
2.整数类型:通常以补码形式存储。
3.浮点类型:浮点数遵循IEEE 754标准,使用一种特殊的格式存储,这包括三个部分:符号位、指数部分和尾数部分。
4.指针类型:指针类型存储内存地址。这些地址通常以原码形式存储,即直接表示地址值的二进制形式。
8.float类型的数,加0.5可以实现小数第一位的四舍五入。如果小于5,则不会进位,大于等于5,则加0.5后就进位了。如果是后面的小数,可先乘以对应位数再四舍五入,之后再除回来就可以了。比如,对第三位进行四舍五入,可先乘以100,然后加0.5,最后除100.0就行了。
9.提取整数的各个位上的数:
int a=4321;
int a1=(a/10/10/10)%10,
a2=(a/10/10)%10,
a3=(a/10)%10,
a4=a%10;
10.
char *str = "hello";
printf("%10saaa\n", str);// helloaaa
printf("%-10saaa\n", str);//hello aaa
在输出时,%后面加数字可以指定输出多少个,多余的会以空格填充
不加-,则是向右靠,加-是向左靠。
可以通过*以变量指定长度:
int num = 123;
int width = 10;
printf("%*d\n", width, num);// 123
%08s,可以指定以0填充。