指针入门一
指针使用前必须初始化,指针指向一块确定的内存区域
确定: 地址确定 大小确定
如果不进行初始化的话,这个指针就会成为“野指针”;对野指针进行操作是很容易造成程序错误的,尽量避免使用
创建指针!!!例如如下:
int *p; //野指针*p = 1000; //不合法
我们可以使用malloc来申请一个内存空间,平常的时候使指针指向一个数组此时所指向的地址是存在栈区(由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。)内的,而我们为指针用malloc申请内存时是存在堆区的,是动态的;如下:
int *p1, *p2;
int a = 100;
p1 = &a; //a存在栈区
p2 =(int*)malloc(sizeof(int)); //堆
printf("%d",*p);
p2 = NULL;
free(p2);
切记动态申请的内存要及时释放,避免出现内存泄漏问题!!!
除了malloc之外我们也可以使用calloc函数来申请动态内存,他们两个的差别就是当你用malloc函数申请内存时内存里装的是一些垃圾数据。而你用calloc函数申请时里面会全部清0,就假如说是int的类型时里面就全部是0,是char类型时里面全部存的‘\0’!使用方法如下:
void *calloc( size_t num, size_t size );
其中size_t num是成员数量,size_t size是你所申请的类型的字节长度!
字符指针:
char c = 'A';
char *p = &c;
char c1[] = "hello"; //c1 == &c1[0]
p = &c1[0];
当用字符串常量给字符指针赋值时,不可以通过指针修改
字符串中的字符。
char c1[] = "hello"; //c1 == &c1[0]
p1 = c1;
p2 = "world";
p1[0] = 'H'; //合法
//p2[0] = 'W'; //不合法
用gets()往指定的内存区域写入内容时要提前分配充足空间
char a[100];
gets(a); //合法 内存地址和大小确定
char *p1;
gets(p1); //不合法 应该提前分配合法的内存空间
char *p2 = "hello";
gets(p2); //不合法,企图修改字符串常量
char *p3;
p3 = (char*)malloc(sizeof(char)*5);
gets(p3); //输入"hello",不合法,分配空间不足可能导致程序崩溃
还学习了有关指针的一些运算,有点儿晕,例如:
int a[3] = { 1,2,3 };
int *p = a;
我们定义一个数组a,里面有3个元素:1,2,3;在定义一个指针让他指向a
当我们进行 ++(*p++);操作后,打印出来*p的值为2,a[0]的值也为2;
当我们进行((*++p)++);操作后,打印出来*p的值为3,a[0]的值为1;
当我们进行(++*p)++;操作后,打印出来的*p的值为3,a[0]的值也为3;
当我们进行((*++p)+1);操作后,打印出来*p的值为2,a[0]的值为1;
还有很多,绕来绕去头晕,我现在的总结就是当进行
*p++和*++p操作时就是使他指向的地址右移一位,即此时指向的a[1];
进行*(p)++和++*p的时候地址没动,是他本身的值增加1,此时a[0]也随动!!!