C语言指针用法详解(二) 指针的算术运算
2017-10-08 14:15
537 查看
例题1:
Question :
char a[20];
int *ptr = (int * )a;
ptr++;
Practice :
Reason :
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[20];
int *ptr = (int * )a;/// 强制类型转换不会改变a的类型
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a
***/
cout<<" befor : " << ptr<<endl;
ptr++;
cout<< " sizeof (ptr) "<< sizeof(ptr)<<endl;
/***
** ptr 类型是指针,指针的自增,当然是增加自身的大小了
** sizeof(ptr) 为4, ptr 增加4
***/
cout<<" after : "<<ptr<<endl;
}
例题2:
Question :
int arr[20] = {0};
int *ptr = arr;
for (int i=0; i<20; i++)
{
(*ptr)++;
ptr++;
}
Practice :
Reason :
#include <bits/stdc++.h>
using namespace std;
int main()
{
int arr[20] = {0};
int *ptr = arr;
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** ptr 的类型是 int* , 指向的类型是 int , 指向 arr
***/
for (int i=0; i<20; i++)
{
(*ptr)++; /// 改变的是 ptr 指向的值
ptr++; /// 改变的是 ptr 指向的地址 ,再次验证 ptr 自增的是 sizeof(ptr)
cout<<" ptr : "<<ptr<<endl;
}
}
例题3:
Question :
char a[20] ="You_are_a_girl;
int *ptr = (int *)a;
ptr += 5;
Practice :
Reason
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[20] = "You_are_a_girl";
int *ptr = (int * )a;
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** ptr 的类型是 int* , 指向的类型是 int , 指向 a
***/
cout<<" ptr : "<<ptr<<endl;
ptr += 5;
/***
** ptr + 5 : 编译器处理为 ptr 的值加上 5 * sizeof(int)
** ptr 向高地址移动20个字节, 此时超出a 的合法范围, 但是语法可以
** 我也不懂 这里为什么超出 a 的合法范围 ????求教
***/
cout<<" ptr : "<<ptr<<endl;
}
例题4:
Question :
char a[20] = "You_are_a_girl";
char *p = a;
char **ptr = &p;
printf("**ptr = %c \n", **ptr);
ptr++;
printf("*ptr = %c \n", **ptr);
Practice :
Reason
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[20] = "You_are_a_girl";
char *p = a;
char **ptr = &p;
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** p 的类型是 char* , 指向的类型是 char , 指向 a
** ptr 的类型是 char ** , 指向的类型是 char* , 指向 &p
***/
printf("**ptr = %c \n", **ptr);
/*cout<<" *p "<<*p<<endl;
cout<<" p "<<p<<endl;*/
cout<<" ptr "<<ptr<<endl;
ptr++;
cout<<" ptr "<<ptr<<endl;
cout<<" sizeof(char *) "<<sizeof(char *)<<endl;
/// ptr自增 ,增加的是它指向的类型的 所占字节
printf("*ptr = %c \n", **ptr);
///
此时 *(ptr) 没人知道回事什么,也许是随机值,也许是非法操作
}
总结:
1. 一个指针ptrold 加或减一个整数n后,结果是一个新的指针ptrnew
ptrold指针的类型 和 ptrnew指针的类型 相同
ptrold指针指向的类型 和 ptrnew指针指向的类型 相同
ptrold指针的指向(值)和 ptrnew指针的指向(值)相差为指向类型的字节数
2. 两个指针不能作加法运算,非法操作
3. 两个指针可以作减法操作,但必须类型相同
Question :
char a[20];
int *ptr = (int * )a;
ptr++;
Practice :
Reason :
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[20];
int *ptr = (int * )a;/// 强制类型转换不会改变a的类型
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a
***/
cout<<" befor : " << ptr<<endl;
ptr++;
cout<< " sizeof (ptr) "<< sizeof(ptr)<<endl;
/***
** ptr 类型是指针,指针的自增,当然是增加自身的大小了
** sizeof(ptr) 为4, ptr 增加4
***/
cout<<" after : "<<ptr<<endl;
}
例题2:
Question :
int arr[20] = {0};
int *ptr = arr;
for (int i=0; i<20; i++)
{
(*ptr)++;
ptr++;
}
Practice :
Reason :
#include <bits/stdc++.h>
using namespace std;
int main()
{
int arr[20] = {0};
int *ptr = arr;
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** ptr 的类型是 int* , 指向的类型是 int , 指向 arr
***/
for (int i=0; i<20; i++)
{
(*ptr)++; /// 改变的是 ptr 指向的值
ptr++; /// 改变的是 ptr 指向的地址 ,再次验证 ptr 自增的是 sizeof(ptr)
cout<<" ptr : "<<ptr<<endl;
}
}
例题3:
Question :
char a[20] ="You_are_a_girl;
int *ptr = (int *)a;
ptr += 5;
Practice :
Reason
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[20] = "You_are_a_girl";
int *ptr = (int * )a;
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** ptr 的类型是 int* , 指向的类型是 int , 指向 a
***/
cout<<" ptr : "<<ptr<<endl;
ptr += 5;
/***
** ptr + 5 : 编译器处理为 ptr 的值加上 5 * sizeof(int)
** ptr 向高地址移动20个字节, 此时超出a 的合法范围, 但是语法可以
** 我也不懂 这里为什么超出 a 的合法范围 ????求教
***/
cout<<" ptr : "<<ptr<<endl;
}
例题4:
Question :
char a[20] = "You_are_a_girl";
char *p = a;
char **ptr = &p;
printf("**ptr = %c \n", **ptr);
ptr++;
printf("*ptr = %c \n", **ptr);
Practice :
Reason
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[20] = "You_are_a_girl";
char *p = a;
char **ptr = &p;
/***
** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
** p 的类型是 char* , 指向的类型是 char , 指向 a
** ptr 的类型是 char ** , 指向的类型是 char* , 指向 &p
***/
printf("**ptr = %c \n", **ptr);
/*cout<<" *p "<<*p<<endl;
cout<<" p "<<p<<endl;*/
cout<<" ptr "<<ptr<<endl;
ptr++;
cout<<" ptr "<<ptr<<endl;
cout<<" sizeof(char *) "<<sizeof(char *)<<endl;
/// ptr自增 ,增加的是它指向的类型的 所占字节
printf("*ptr = %c \n", **ptr);
///
此时 *(ptr) 没人知道回事什么,也许是随机值,也许是非法操作
}
总结:
1. 一个指针ptrold 加或减一个整数n后,结果是一个新的指针ptrnew
ptrold指针的类型 和 ptrnew指针的类型 相同
ptrold指针指向的类型 和 ptrnew指针指向的类型 相同
ptrold指针的指向(值)和 ptrnew指针的指向(值)相差为指向类型的字节数
2. 两个指针不能作加法运算,非法操作
3. 两个指针可以作减法操作,但必须类型相同
相关文章推荐
- C程序设计语言- 指针与数组-4.1----指针与地址、指针与函数参数、指针与数组、地址算术运算
- C语言指针的算术运算
- bc命令_Linux bc 命令用法详解:算术操作精密运算工具
- go语言笔记——指针,和C用法以及本质一样,但不支持指针的+-运算!
- C语言指针详解及用法示例
- C++中this指针的用法详解
- C 语言指针的用法
- 指针的算术运算
- linux eval命令参数及用法详解--linux重新运算求出参数的内容
- C 语言指针概念的详解
- enum以及位域运算符的高级用法(详解-最易理解位域运算的教程)
- c++ 智能指针用法详解
- 指针的算术运算
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表
- 指针算术运算
- c++ 智能指针用法详解
- 【C++】指针(2):NULL指针、指针的算术运算
- C语言--指针用法详解
- C++中this指针的用法详解
- 2.3 数据集合与指针的算术运算