一 指针 1 内存地址的概念 内存地址:内存中存储单元的编号. 变量地址:系统分配给内存单元的起始地址。 2 指针的概念 指向内存单元的地址。 3 指针的好处 1) 让函数有多个返回值。 2) 为函数提供修改和调用变量的灵活手段。 3) 可以改变某些子程序的效率。 4) 为动态数据结构(二叉树,链表)提供支持 4 变量的存取方式 a直接存取:通过变量名称赋值和取值 b间接存取:通过指针对变量赋值和取值。 5 指针变量概念 存储指针的变量 变量的值是一个地址。 6 指针变量定义和初始化 类型说明符 * 变量名; charch=‘a’; char*p = &ch; 注意 a 类型说明符是指针变量指向的变量的数据类型。 b *说明定义的变量是一个指针变量。 c指针变量有全局 和局部之分 d 不初始化的指针变量存储的值为随机数,这种指针称为野指针。 f 不知道指向的指针变量最好赋值为 null。 g 定义什么类型的指针就应该指向什么类型的变量 7 指针变量的引用 *p 取p地址存储的值。 8 指针应用场景 1) 在被调函数中修改主调函数的变量值。 2) 在函数中实现返回多个返回值,在传参数的时候将将要返回值的地址传入被调函数中。修改地址对应的值就可以实现多个返回值。 9 二级指针 指向指针的指针 10 数组指针 指向数组的指针 1)指针与一维数组 int a[3]={1,2,3}; int *p =a; a为数组名 存储的是数组的首地址。 p+1:指向数组中下一个数据的地址 *p++ 指针偏移 先取p值 再加 *p++ 的值为*p的值 2)指针与二维数 组 int a[2][3]={1,2,3,4}; a 是数组首地址 也是第0行的首地址,也是第0行第0列的地址 a[0]+i 是第0行第i列的地址。 a+i表示第i行首地址 *(a+i)为第i行的首地址。 **(a+i) 为第i行第0列的值。 *(*(a+i)+j)为第i行j列的值。 11 一维指针数组 存储指针的数组。 int a=b=b=3; int *p[3]={&a,&b,&c}; p为数组的首地址,也是第一个元素的存储地址。 使用数组名访问a的值 *p 为第一个元素的值也为a的地址 **p 为a的值。 12 二维数组指针 C 语言中可以通过定义行数组指针的方法,使得指针变量与二维数组名有相同的性质。 数据类型 (*指针变量名)[二维数组的列数]; int a[2][2]={1,2,3,4}; int (*p)[2]=a; 定义一个数组指针,指向含2个元素的一维数组。 二维数组中 a=&a[0]=&a[0][0]=a[0] *(*(p+i)+j)获取二维数组的每个值。 指针数组和二维数组指针的区别 指针数组 int*p[2] ;多个指针 二维数组指针 int (*p)[2]; 一个指针变量 13 字符串指针 字符串定义 charstr[10]=“abcdef”; 字符串指针定义 char *str; str = “dasda“;取字符串的首地址赋值给str str都为字符串的首地址。 14 char型指针数组 char 类型指针数组 1)定义 char *name[3]={ “xiaoming”, //值都是字符串的首地址 “xiaohong”, “xiaohuang” } 2)使用 指针法printf(”%s\n”,*(name+ i)); 下标法 printf(”%s\n”,name); name为指针数组的第i个元素的值,也为字符串的首地址。 3)字符串指针和字符数组的区别 字符串指针:char *str=“abc “; abc保存在常量区 str为指针变量可以重新赋值(指向) 字符数组 :char str[]=“abc “; abc保存在栈区 str为常量值为abc的首地址不能重新赋值。 15 fgets函数的使用 暂时使用fgets接收从键盘接收一个字符串,保存到数组中。 scanf不可以接收空格。 gets可以接收空格,越界访问警告 fgets 安全的字符串接收函数。保留一个位置存\0. 使用格式 fgets(字符数组名,长度 ,stdin); int ch[10]; fgets(ch,sizeof(ch),stdin); 16 fputs函数的使用 fputs(地址,stdout); //不会自动换行 puts可以自动换行。都不能格式化输出 17 const关键字 const是类型修饰符。 修饰的变量值不能改变。静态常量。
|