C++学习(十九)(C语言部分)之 指针3
复习
1、一级指针
int*p 指向int的指针
赋值 int x;
p=&x;//
*p=2;
指针指向的谁 解引用之后就是谁
2、内存四区
堆区 需要自己手动申请内存 自己释放 (malloc free realloc(内存重新分配) alloc(比malloc多了一个赋值默认值的操作))
内存大
栈区 函数定义的变量 在栈区 系统会自动申请 回收内存 系统管理的内存很少
全局常量 全局(函数在外面) 静态 static int x=1 char*p="hello" (常量区的数据不能修改)
代码区
3、动态数组
int arr[10];
动态数组 在堆区的数组
int *p;
p=(int*)malloc(sizeof(int)*10);//在堆区申请一块内存当做数组使用
//p[0] p[1] p[2]
//*(p+0) *(p+1) *(p+2)
1、定义字符数组的时候 赋值字符串(有\0)
2、scanf gets strcpy (自动加\0)
循环赋值 手动添加
新内容
1、多级指针(二级指针)
指向指针的指针 存放的是指针的地址
2、指针运算
* [] & + - ++ --
* 解引用 主要用于指针 取得指针指向的元素(取值)
(同样可以用于数组)
[] 同样有解引用的作用
arr[2]//去下标为2的元素 *(arr+2) 数组指针都可以这样用
*(arr+2) *(arr+2)--->2[arr]
*(arr+2) arr是指针或者数组名n是int--->arr[n]
*(p+n)等价p[n]
& 取变量地址
指针可以进行加减运算
指针和int进行加减
p+1--->&p[1]//指针的运算 p+1指向下一个元素
指针的++和--(指针运算 也有越界的可能 p+9---->arr[10]越界)
指针和指针 相加没有意义
指针和指针相减 指向同一个数组的不同元素的指针可以相减 其他情况没有意义
p指向arr[4] q指向arr[7]
p-q=4-7=-3(就是两个元素之间隔得多远 距离)
-->比较关系 > < 指向不同位置之间的元素可以相减(就是下标之间的相减)
3、数组和指针的关系
一维数组 对应的是以及指针
int arr[10]; int*p; p=arr;//数组名可一直接赋值一级指针
用法是一样的 数组名赋值的时候相当于数组首地址
用里面的元素 *p p[n]
(数组名 不能++ 常量不能++ 也不能赋值)
二维数组 (数组的数组)
int dArr[7][8];// dArr 首元素的地址 &dArr[0]//取一行的地址 数组的地址 对应 数组的指针
int(*pArr)[8]; //数组指针 pArr=dArr
数组名相当于数组首地址 不是变量 常量 但是不能作为左值 也不能++--
4、了解 const指针
const int x=10;//定义常量必须赋值 const修饰的常量不能修改
对于指针 有点特殊
const int*y;和int const*y;效果一样
const修饰的是*y y可以改变 但是*y不能修改
int *const z 指针常量
const直接修饰z 表示z不能修改 但是*z可以修改
C语言中 const修饰变量 在栈区
C++ 中 const修饰的是常量 在常量区
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 //int x; 6 //printf("请输入大小:\n"); 7 //scanf_s("%d",&x);//scanf_s与scanf是由于vs的版本不一样所用的形式不一样 其效果一样 8 //char *p = (char*)malloc(sizeof(char)*x);//大小为x的数组 9 //for (int i = 0; i < x; ++i) 10 //{ 11 // *(p + i) = 'A' + i;//随便赋的值 A=65 12 //} 13 //p[x - 1] = '\0';//最后一个元素 14 //puts(p);//打印内容 15 //int arr[10]; 16 //arr[0]; 17 //*(arr + 0); 18 //getchar(); 19 //while (1); 20 //free(p);//释放p的内存 申请的内存必须释放 21 //return 0; 22 23 //int x; 24 //printf("请输入大小:\n"); 25 //scanf_s("%d",&x);//scanf_s与scanf是由于vs的版本不一样所用的形式不一样 其效果一样 26 //char *p = (char*)malloc(sizeof(char)*x);//大小为x的数组 27 //for (int i = 0; i < x; ++i) 28 //{ 29 // *(p + i) = 'A' + i;//随便赋的值 A=65 30 //} 31 //p[x - 1] = '\0';//最后一个元素 32 //puts(p);//打印内容 33 //char **pp = &p;//得到的是指针变量的地址 一级指针的地址 用二级指针 保存 34 ////pp保留的是p的地址 35 36 //int x; 37 //int*q = &x;//*q 代表着x 38 //int**qq = &q;//qq指向q *qq代表着q **qq代表着是*q 也就是说代表着x 39 //printf("x的地址:%p,\nq的地址:%p,\nqq的地址:%p\n",&x,&q,&qq); 40 //printf("q存放的值:%p,\nqq存放的值:%p\n",q,qq); 41 42 //int arr[10]; 43 //for (int i = 0; i < 10; ++i) 44 //{ 45 // arr[i] = i; 46 // printf("%d\t",i[arr]);//i[arr] 一样 arr[i] *(arr+i) 47 //} 48 49 //int arr[10]; 50 //int*p = &arr[1]; 51 //printf("arr[1]的地址:%p\n",p);//这是arr[1]的地址 52 //printf("p+3的值是:%p,\narr[4]的地址是:%p\n",p+3,&arr[4]); 53 54 int dArr[7][8]; 55 int(*pArr)[8];//数组指针 8是列 56 pArr = dArr;//二维数组首地址赋值给数组指针 57 pArr[0][0];//解两次引用才是数组元素 58 for (int i = 0; i < 7; ++i) 59 { 60 for (int j = 0; j < 8; ++j) 61 { 62 pArr[i][j];//dArr[i][j] 用指针操作数组中的元素 63 //相同的 *(*(pArr+i)+j); 64 } 65 } 66 67 getchar(); 68 while (1);//防止闪屏 69 return 0; 70 }
2018-07-25 11:46:15