c++一阶指针

定义

存储类型名 数据类型 * 指针变量名;

Eg:int *a;//定义了一个指向整型的指针 a;

指针使用方法

int a,*b;

b=&a;//表明将a的地址赋值给b;

*b=5; //将b指针所指向的地址赋值给5;即等同于a=5;

指针使用前必须赋一个合法的值
       int *a,b;

*a=5;//这种表达方式是错误的,因为没有对a进行初始化,而就进行赋值。

void *a//万能指针,可以接受任何类型的指针,
     int *a;
     void *b;
     char *c;
        b=a;//正确,因为void指针可以接受任何类型的指针
        a=b;//错误,因为void指针不能直接赋值给其他类型指针 正确写法应为a=(int *)b;将b强制类型转换为整形指针,在复制;
        c=(char *)b;//正确; 
二阶指针//二阶指针,顾名思义,既为指向指针的指针;
       定义:存储类型 数据类型 ** 指针变量名
         Eg  int **p;//二阶指针

#include<iostream>
Using namespace std;
int main(){
int i,*q,**p;
  i=123,q=&i,p=&q;//简单解释一下二阶指针,
cout<<**p;
return 0;
}
指针函数传值

void swap(int *x,int *y){}
int main()
{int a,b,*p=&a,*q=&b;
swap(p,q);
swap(&a,&b);
 指针数组与数组指针
      指针数组
             int *p[10];//定义了一个指针类型的数组,数组中每一个元素都为一个指针类型;
      数组指针
             int(*p)[10];// 定义了一个指向数组的指针;         
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[2][5]={1,2,3,4,5,6,7,8,9,0};
int (*p)[5]=a;
cout<<"*p[1]="<<*p[1]<<endl;
cout<<"*(p[1]+1)="<<*(p[1]+1)<<endl;
char *q[5]={"a","b","c","d","e"};//指针数组这样初始化dev会有警告,但vc不会有任何警告;不建议读者用这种初始化。
cout<<"q[1]="<<q[1]<<endl;//因为q[10]为指针类型数组,所以q中存储的为地址。
return 0;
}
 指针函数与函数指针
     指针函数//返回值为指针的函数;
   定义:类型名 * 函数名(参数列表);
Eg:int * max(int *x,int *y);
  {
      returen *x>*y?x:y;
   }
    函数指针//算法竞赛中基本不用,只顺便提一下,既为指向函数的指针;
           定义:函数类型 (*指针名) (函数形参表);
           Eg
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int main()
{ int a=1,b=2;
int (*p)(int,int);
p=max; cout<<p(a,b);//也可以写成(*p)(a,b),其中*运算没有意义
p=min; cout<<p(a,b);
return 0;  

指针与数组

    c++中数组名既为一个地址;故可以赋值给指针变量;
      Eg
          int a[10];*p;
          p=a;//正确;
        二维数组—特殊的二阶指针;
            int b[10][10];
            将二维数组理解为矩阵;
            b为二阶指针;
               b所指位置为行,称为行指针;
               对b进行一次*运算,便转换为列指针,从而确定每一个元素所在位置。
             int a[10],*b;
                   b=a;// 正确,b++;就相当于地址向右移动,b--就相当于地址向左移动,<,>,>=,<=,!=在指针运算中也适用  
             int a[10][10],**b;
                  b=a;//这种方式是错误的.
            int a[10][10],(*b)[10]; 
                  b=a;//正确。
           int *(*P)[10];//指向指针数组的数组指针

char a[20];

int *ptr=(int *)a; ///强制类型转换并不会改变a的类型

ptr++;

  在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整型变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4,因为在32位程序中,int占4个字节。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。

c++之路起航——指针的更多相关文章

  1. 1.Magicodes.NET框架之路——起航

    1.Magicodes.NET框架之路--起航 前言 从事开发也好几年了,并且最近一直在做架构搭建的工作.这些时间,最大的感悟就是: 只有自己理解了的才是自己的. 对架构这块,若欲立之,必先破之. 故 ...

  2. C++之路起航——标准模板库(vector)

    vector(动态数组或向量):动态分配内存空间的线性储存结构. 需要包括头文件<vector> 定义: vector<数据类型> 变量名: Eg: vector<int ...

  3. oc学习之路----多级指针的使用和内存分析

    ---恢复内容开始--- 精髓:要熟悉指针的使用,首先要熟悉指针的各种状态存得是什么数据.(以一级指针 int *p1 二级指针:int **p2 三级指针:int ***p3为例) 一级指针:*p1 ...

  4. 菜鸟的it之路-起航

    之前在知乎上看见怎么学习数据结构下一位答主的回答,他引用了N.Wirth(沃斯)的话:程序=数据结构+算法.(哈,菜鸟无法验证这句话的正确性有多大)但毫无疑问的是,数据结构应当是一名菜鸟程序狗要重点学 ...

  5. C++之路起航——标准模板库(queue)

    queue: FIFO队列:先进先出队列. 优先队列:对队列中的元素按优先级的大小输出. 定义: FIFO队列: queue<数据类性>变量名. 优先队列:priority_queue&l ...

  6. C++之路起航——标准模板库(deque)

    deque(双端队列):http://baike.baidu.com/link?url=JTvA2cuLubptctHZwFxswvlZvxNdFOxmifsYCGLj5IZF-Tj4rbWLv8Jn ...

  7. C++之路起航——标准模板库(set)

    set(集合):http://baike.baidu.com/link?url=cb68AB-3qfEK8RoaGHJFClb4ZiWpJfc32lPOLtaNUrdxntFC738zCZsCiUlf ...

  8. C++之路起航——标准模板库(list)

    list(链表):http://baike.baidu.com/link?url=gkVdBlHEzy6ssrgT5Iy2wze4jl37ka1G45TRpUHrQSYFZQg2HimtUCePV0t ...

  9. [转载]C++之路起航——标准模板库(deque)

    转自:https://www.cnblogs.com/grhyxzc/p/5074061.html deque(双端队列):http://baike.baidu.com/link?url=JTvA2c ...

随机推荐

  1. Mac 下 命令收藏

    1.查看文件的二进制 xxd -b test.wav 2.所有占用的端口 sudo lsof -i -P | grep -i "listen" 原文地址:Mac 下 命令收藏标签: ...

  2. 创建QT CREATOR对话框报错 linux QT Creator :-1: error: cannot find -lGL

    装完QT5.4 及 QT Creator3.3 后 创建第一个QT Widgets Application(相当于窗体) 应用程序 报如上错误. 执行 sudo apt-get install lib ...

  3. 初学MyBatis.net

    1.MyBatis.net介绍 MyBatis..net是一个简单,但是完整的ORM框架,它使你的实体对象与sql语句或者存储过程之间的映射变得很简单,并提供数据访问.包括两个主要框架 DataAcc ...

  4. 我的第一个chrome扩展(2)——基本知识

    1.manifest介绍界面:json格式 json:JavaScript Object Notation 包括两种结构: key:value对:{{"A1":"valu ...

  5. GDB多线程调试

    一.多线程调试1. 多线程调试,最重要的几个命令:info threads                        查看当前进程的线程.                              ...

  6. eclipse根据.wsdl文件自动生成webservice的调用客户端

    1.工具:eclipse3.3或者是带有webservice插件的eclipse 2. 首先用浏览器访问webservice的站点,接着保存打开的页面,后缀为.wsdl. 3.把保存好的文件拷入ecl ...

  7. 转:Asp.net Mvc4默认权限详细(上)

    前言 上篇的菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止. 本文主要在于 ...

  8. 如何解决jQuery Validation针对动态添加的表单无法工作的问题?

    为了充分利用ASP.NET MVC在服务端呈现HTML的能力,在<利用动态注入HTML的方式来设计复杂页面>一文中介绍了,通过Ajax调用获取HTML来呈现复杂页面中某一部分界面的解决方案 ...

  9. Caused by: java.lang.OutOfMemoryError: PermGen space.

    现在eclipse需要加载4个项目同时运行了,所以当服务启动的时候,出现Caused by: java.lang.OutOfMemoryError: PermGen space.空间不足错误,我说一下 ...

  10. [LeetCode]题解(python):041-First Missing Positive

    题目来源 https://leetcode.com/problems/first-missing-positive/ Given an unsorted integer array, find the ...