指针变量的定义
变量类型 *变量名;
#include <stdio.h> int main() { // 指针就一个作用:能够根据一个地址值,访问对应的存储空间 // 指针变量p前面的int:指针变量p只能指向int类型的数据 int *p; // 定义了一个指针变量p
int a = 90; p = &a; // 指针变量p指向了变量a 指针变量只能存储地址
*p = 10; //这里的*与定义指针变量时的*不同,它表示访问对应的存储空间 a = 20; printf("%d\n", *p); return 0; }
指针相关
/* %d int %f float\double %ld long %lld long long %c char %s 字符串 %zd unsigned long */ #include <stdio.h> int main() { char *cp; int *ap; long *bp; printf("cp=%zd, ap=%zd, bp=%zd\n", sizeof(cp), sizeof(ap), sizeof(bp));
// 任何指针都占用8个字节的存储空间 64位编译器 思考下为什么指针要分类型 (计算机根据指针的类型来确认从内存中取多少个字节的内容) }
练习
//根据指针 在函数内部修改外部的变量 #include <stdio.h> void change(int *p); int main() { int a =10; change(&a); printf("a=%d\n",a); return 0; } void change(int *p) { *p = 20; }
//利用指针让函数间接的有多个返回值 #include <stdio.h> int main() { int a = 15; int b = 10; int he=0,cha=0; test(a,b,&he,&cha); printf("和是%d,差是%d",he,cha); } void test(int a,int b,int *c,int *d) { *c = a+b; *d = a-b; }
指针与数组
#include <stdio.h> /* 1.数组元素的访问方式 int ages[5]; int *p; p = ages; 1> 数组名[下标] ages[i] 2> 指针变量名[下标] p[i] 3> *(p + i) //指针的+1并不是值加一 2.指针变量+1,地址值究竟加多少,取决于指针的类型 int * 4 char * 1 double * 8 */ void change(int array[]); int main() { // 20个字节 int ages[5] = {10, 11, 19, 78, 67}; change(ages); return 0; } // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素 void change(int *array) { printf("%d\n", array[2]); //printf("%d\n", *(array+2)); } /* void change(int array[]) { int s = sizeof(array); printf("%d\n", s); }*/ void test() { double d = 10.8; double *dp; dp = &d; printf("dp = %p\n", dp); printf("dp + 1 = %p\n", dp + 1); int ages[5] = {10, 9, 8, 67, 56}; int *p; // 指针变量p指向了数组的首元素 p = &ages[0]; // 数组名就是数组的地址,也是数组首元素的地址 //p = ages; /* p ---> &ages[0] p + 1 ---> &ages[1] p + 2 ---> &ages[2] p + i ---> &ages[i] */ //printf("%d\n", *(p+2)); printf("%d\n", p[2]); /* for (int i = 0; i<5; i++) { printf("ages[%d] = %d\n", i, *(p+i)); }*/ // printf("%p\n", p); // printf("%p\n", p + 1); // printf("%p\n", p + 2); }
指针与字符串
#include <stdio.h> /* 1.常量区 存放一些常量字符串 2.堆 对象 3.栈 存放局部变量 掌握: 定义字符串的2种方式 1> 利用数组 char name[] = "itcast"; // 字符串变量 * 特点:字符串里面的字符是可以修改的 * 使用场合:字符串的内容需要经常修改 //char name[] = "it"; //name[0] = 'T'; //printf("%s\n", name); // "it" == 'i' + 't' + '\0' 2> 利用指针 char *name = "itcast"; // 字符串常量 * 特点:字符串其实是一个常量字符串,里面的字符是不能修改 * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用,它被缓存起来,新定义指针是不在开内存空间的 // char *name2 = "it"; //char *name3 = "it"; //*name2 = 'T'; //程序会崩溃 它是常量不能修改 //printf("%c\n", *name2); // 指针变量name2指向了字符串的首字符 printf("%p\n%p\n", name2, name3); //不开新空间 地址相同 //printf("%s\n", name2); //直到遇到\0 */ int main() { char name[20]; printf("请输入姓名:\n"); scanf("%s", name); // 'j' 'a' 'c' 'k' '\0' //printf("%c\n", name[3]); //printf("刚才输入的字符串是:%s\n", name); return 0; } // 定义字符串数组 void test2() { char *name = "jack"; //int ages[5]; // 指针数组(字符串数组) char *names[5] = {"jack", "rose", "jake"}; // 二维字符数组(字符串数组) char names2[2][10] = {"jack", "rose"}; }