关于指针
1)内存会划分以字节(byte)为单位的空间,每个字节都有一个编号(地址/指针);
2)指针变量可以存放这个编号(地址/指针);
3)我们日常所说的指针,一般是指针变量。
字符指针
代码示例:
int main(){
char ch = 'w';
char* p= &ch;
char* pa = "abcdef";
return 0;
}
字符变量ch里面存放了字符w
字符指针p里面存放了ch的地址
指针变量pa里面存放了abcdef字符串的地址,我们并没有对这个字符串进行初始化。而是直接把它放进了指针变量pa里面。
和前两行的字符w不同,abcdef是存储在内存中的只读数据区,无法修改,即便通过指针也无法修改。
为了避免理解出错,我们一般会加上const修饰
const char* pa = "abcdef";
//表示指针指向的内容不能通过指针来改变
const放在*的左边
表示const修饰的指针指向的内容,表示指针指向的内容不能通过指针来改变
但是指针变量本身是可以改变的
const放在*的右边
表示const修饰的是指针变量本身,指针变量的内容不能被修改
但是*pa指针指向的内容是可以通过指针来修改的
代码示例
#include<stdio.h>
#include<string.h>
int main(){
char arr1[] = "abcdef";
char arr2[] = "abcdef";
const char* str1 = "abcdef";
const char* str2 = "abcdef";
//
if (arr1 == arr2)
printf("arr1==arr2\n");
else
printf("arr1!=arr2\n");
//
if (str1 == str2)
printf("str1==str2\n");
else
printf("str1!=str2\n");
return 0;
}
运行结果:
arr1!=arr2
str1==str2
--------------------------------
Process exited with return value 0
Press any key to continue . . .
分析:
str1和str2这种情况都指向一个常量字符串;
既然字符串abcdef无法被改变,编译器也没有必要创建两个独立的内存空间来存放两个相同的字符串,所以str1和str2的地址是完全一样的;
而arr1和arr2是完全不同的数组,它们的首元素地址不一样,打印的结果是不相等。
typedef关键字
简单说,typedef的作用就是把一个已有的类型名换一个新的名字
typedef int* pint;
这句代码的意思是:将int*命名为pint
pint在使用的时候和int*完全一致
我们仍然可以使用int*
在结构体里面,我们可以用typedef来缩短原有结构体定义的语句
如:将struct Stu命名为Stu
typdef struct Stu{
int ID[10];
char name[10];
int age;
}std;
typedef和#define的区别
同样可以使用#define语句,进行这项操作
#define PINT int*
定义语句PINT为int*
指针连续定义
先了解一下如何正确连续定义两个指针
int*pa,*pb;//正确的连续定义
int*pa,pb;//错误,其中pa是int*类型,而pb是int类型
因为这两个的情况非常容易搞混,所以我们不建议连续定义指针
typedef int* pint;
#define PINT int*
int main(){
pint pa,pb;//可连续定义指针
//pa-->int*
//pb-->int*
PINT pa,pb;//等同于int*pa,pb
//pa-->int*
//pb-->int
}
·typedef会产生一个新的变量类型
·#define只是在对应位置进行替换
因为typedef产生了一个新的类型,pint为int*,但与int*也有不同
int pa,pb;//pa,pb都是int类型
pint pa,pb;//pa,pb都是int*类型
而直接用int*进行连续定义指针变量是错误的
int*pa,pb;//错误,其中pa是int*类型,而pb是int类型
----------------END----------------