1、“带*类型” 的特征探测:宽度
注:对于一个变量来说,最重要的一个特征就是数据的宽度。
2、“带*类型”的特征探测:声明
推荐 | 不推荐 |
---|---|
char* x; | char *x; |
short* y; | short *y; |
int* z; | int *z; |
float* f; | float *f; |
double *d; | double *d; |
Student* st; | Student *st; |
总结:
1.带有 * 的变量类型的标准写法: 变量类型* 变量名
2.任何类型都可以带* ,加上*以后是新的类型
3.*可以是任意多个
3、“带*类型”的特征探测:赋值
char、short、int 类型变量的赋值:
精简写法 | 完整写法 |
---|---|
char x; | char x; |
short y; | short y; |
int z; | int z; |
x = 1; | x = (char)1 |
y = 2; | y = (short)2; |
z = 3; | z = (int)3; |
带 * 类型的变量的赋值:
char* x; |
---|
short* y; |
int* z; |
x = (char*)1; |
y = (short*)2; |
z = (int*)3; |
数据的宽度:
#include "stdafx.h"
void Function()
{
char x;
short y;
int z;
x = 1;
y = 2;
z = 3;
}
int main(int argc, char* argv[])
{
Function();
return 0;
}
char、short、int分别是1个字节、2个字节、四个字节
void Function()
{
char* x;
short* y;
int* z;
x = (char*)1;
y = (short*)2;
z = (int*)3;
}
int main(int argc, char* argv[])
{
Function();
return 0;
}
char*、short*、int*都为四个字节
char**、short**、int**一样为四个字节,在此没有列出,可自己试验
总结:
1.带 * 类型的变量赋值时只能使用“完整写法”
2.带 * 类型的变量宽度永远是4字节、无论类型是什么,无论有几个 * .
4、“带*类型”的特征探测:++ –
#include "stdafx.h"
int main(int argc, char* argv[])
{
char* a ;
short* b ;
int* c ;
a = (char*)100;
b = (short*)100;
c = (int*)100;
a++;
b++;
c++;
printf("%d %d %d",a,b,c);
return 0;
}
#include "stdafx.h"
int main(int argc, char* argv[])
{
char** a ;
short** b ;
int** c ;
a = (char**)100;
b = (short**)100;
c = (int**)100;
a++;
b++;
c++;
printf("%d %d %d",a,b,c);
return 0;
}
总结:
1、不带 * 类型的变量,++或者-- ,都是加1,或者减1
2、带 * 类型的变量,也可进行++ 或者–的操作
3、带 * 类型的变量,++或者–时,增加(减少)的数值是减去一个 * 后变量的宽度
5、“带*类型”的特征探测:加上/减去一个整数
#include "stdafx.h"
int main(int argc, char* argv[])
{
char* a ;
short* b ;
int* c ;
a = (char*)100;
b = (short*)100;
c = (int*)100;
a = a + 5;
b = b + 5;
c = c + 5;
printf("%d %d %d",a,b,c);
return 0;
}
#include "stdafx.h"
int main(int argc, char* argv[])
{
char** a ;
short** b ;
int** c ;
a = (char**)100;
b = (short**)100;
c = (int**)100;
a = a + 5;
b = b + 5;
c = c + 5;
printf("%d %d %d",a,b,c);
return 0;
}
总结:
1、带 * 类型的变量可以加(减)一个整数,但不能乘或者除
2、带 * 类型变量与其他整数相加或相减时:
(1)带 * 类型变量 + N = 带 * 类型变量 + N
×
\times
×(去掉一个 * 后类型的宽度)
(2)带 * 类型变量 - N = 带 * 类型变量 - N
×
\times
×(去掉一个 * 后类型的宽度)
6、“带*类型”的特征探测:求差值
#include "stdafx.h"
int main(int argc, char* argv[])
{
char* a ;
char* b ;
a = (char*)200;
b = (char*)100;
int x = a - b;
printf("%d\n",x);
return 0;
}
#include "stdafx.h"
int main(int argc, char* argv[])
{
short* a ;
short* b ;
a = (short*)200;
b = (short*)100;
int x = a - b;
printf("%d\n",x);
return 0;
}
#include "stdafx.h"
int main(int argc, char* argv[])
{
short** a ;
short** b ;
a = (short**)200;
b = (short**)100;
int x = a - b;
printf("%d\n",x);
return 0;
}
上边的本来应该试一下int* 但是short** 消去一个 * 后的数据宽度都为4个字节,一样理解
总结:
1、两个类型相同的带 * 类型的变量可以进行减法操作(加法不能编译成功)
2、相减的结果要除以去掉一个 * 的数据的宽度
7、“带*类型”的特征探测:比较
#include "stdafx.h"
int main(int argc, char* argv[])
{
char**** a ;
char**** b ;
a = (char****)200;
b = (char****)100;
if(a>b)
{
printf("1");
}
else
{
printf("2");
}
return 0;
}
总结:
带 * 的类型,如果类型相同,可以做大小的比较
文章总结
这是开始学习指针的开始,初学习
带 * 的类型,所有的运算都要跟消去一个 * 相关
练习
本节练习:
1、char类型占几字节?char*类型占几字节?int*****占几字节?
解:都占4个字节
2、char** arr[10] 占多少个字节?
解: 40个字节
3、自定义结构体如下:
struct Student
{
int x;
int y;
};
第一步:
Student**** s;
s = (Student****)100;
s++; //s的值是多少?
s = s+2; //s的值是多少?
s = s-3; //s的值是多少?
解:
s++ | 104 |
---|---|
s+2 | 108 |
s-3 | 88 |
第二步:
Student**** s1;
Student**** s2;
int x;
s1 = (Student****)200;
s2 = (Student****)100;
x = s1-s2; //x的值是多少?
解:25