疑惑内容如下:
- 指针也是一种变量
- *操作符的含义
- 指针变量和它所指向的内存块是二个不同的概念
- *p 含义
- getchar()操作符
- gets和getchar的区别
- strlen
- strcmp比较符
- c语言中声明和定义的区别
- unsigned/signed的解释
-
指针也是一种变量,占有内存空间,用来保存内存地址
-
操作符的含义(下文拿p举例)
在指针申明时, *号所申明的变量为指针
在指针使用时, *号表示操作指针所指向内存空间的值
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边,给p所指向的内存赋值
*p放在等号的右边,通过p里面的内存地址,找到对应的变量,然后取值 -
指针变量和它所指向的内存块是二个不同的概念
定义一个指针变量p
①在给p赋值时,只会改变p所指向的内存地址(指针变量的值),并没有改变p所指向的内容(内存块的值)
②给p赋值*p='a'; 不会改变p所指的内存地址(指针变量的值),只会改变所指的内存块的值 。
接下来看看间接赋值的理解:
int *p=NULL(int *p,p=NULL);//定义一个指针变量p,他的地址为0;
int a=10;
p=&a;//把a的内存地址赋给p;
*p=20;//改变p所指的内存块的值,也就是改变了a的值 -
p 含义 :这是一个指针,他也是一个变量,他特殊在,p只能存地址,所以平时我们更改p变量的值,同时就更改了p所指向的内存,当加入花的时候,表示我要去操作或者说我要去访问这个内存地址了
-
getchar()操作符的解释说明
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, j, k;
char str[5];
for (i = 0; i < 5; i++) {
str[i] = getchar();//当程序调用到这里的时候, 程序就等待用户的输入,如果用户输入的
//不止一个字符,那么就会存入键盘的缓冲去中,当用户点击回车的时候,程序会自动从
//缓冲区中一个,一个字符的读取
//程序会在getchar这里一直等待用户回车,不回车,不会继续执行下一步
}
for (i = 0, j = 4; i < j; i++,j--) {
k = str[i];
str[i] = str[j];
str[j] = k;
}
for (i = 0; i < 5; i++) {
printf("%c", str[i]);
}
system("pause");
return 0;
}
getchar();//当程序调用到这里的时候, 程序就等待用户的输入,如果用户输入的,
不止一个字符,那么就会存入键盘的缓冲去中,当用户点击回车的时候,程序会自动从缓冲区中一个,一个字符的读取
- gets和getchar的区别:
gets(字符数组):
char str[20]
gets(str);
getchar:获取输入的单个字符
-
strlen 获取字符串的长度,不包括'\0';
-
strcmp比较符
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b));
printf("strcmp(a, c) : %d\n", strcmp(a, c));
printf("strcmp(a, d) : %d\n", strcmp(a, d));
输出结果:
strcmp(a, b) : 32
strcmp(a, c) :-31
strcmp(a, d) : 0
虽然给的是字符串,但是比较的时候,是一个一个比较的时候,只要其中一个比较出了大小,就已经可以做出判断了。上面的小a(97) 和大A(65) 所以 a>b
- c语言中声明和定义的区别
最根本区别:不需要开辟内存空间的是声明,需要开辟内存空间的是定义;
extern int b;//我们可以明确的确定它是申明,因为有extern标签
int main( )
{
int a;//我们可以说它是申明,也可以说它是定义
}
通过上面的代码我们可以得出下面结论,如果没有开辟内存空间就是申明,开辟了内存空间就是定义,我们再看下面的一种形式
int main( )
{
extern int a; //这是声明不是定义。声明a是一个已定义的外部变量
}
int a; // 是定义,定义a为整型外部变量
这里相同的变量处于同一个.c文件里面,有一个地方对变量a申明了,我们再次去int a 那么这个a就是定义,申明可以有很多次,但是定义只能有一次,如果相同的变量处于同一个.c文件里面,再次去形如int a 这样去使用它,那就是定义了
-
unsigned/signed的解释
平常我们定义一个int a 是带有符号的signed(默认在使用的时候隐藏),它的取值范围是-32768 到 +32767的整数
我们无符号的unsigned取值范围是 0到 65535。
在此解释之前,我们需要了解下基础知识,看看我们平时存储的数字在计算机中怎么存储的,我拿16-bit 计算机为例子:
int singed a = 1 的存储方式如下;
singed.png
上面表格中最左端的为最高位,最右端的为最低位,signed类型的整数,要去除最高位(符号位),剩下的15位来进行编码的,而最高位只是用来做标记的,标记的是整数的正负,0表示正,1表示负。
那么我们去除最高位后(符号标记位),负数取值范围是:-2^15, 正数的取值范围是:2^15 -1。
针对有符号位的整形 int a = -1 是怎样存储在计算机里面的?
存储方式:原码---->反码---->补码
原码图

反码图=原码图全部数字取反

补码图=反码图最后一位数字+1

以上就是我们数字在计算机里面的存储的方式了。
对于unsigned的整数,是没有符号位的,所以其16位全部用来编码(没有符号位了),取值范围就是从0开始了,0到2^16。
总结下:
signed的取值范围是从-2^15 到 2^15-1,为啥是15次方呢?因为singed是需要有符号位的,我们计算的时候,需要去除掉最高位符号位。
unsigned的取值范围是0 到 2^16-1 ,所以整的来说,在正数上面unsigned的取值范围大于signed
未完待续。。。。
网友评论