文档章节

关于指针的一些事情

notAcoder
 notAcoder
发布于 2013/09/28 02:40
字数 675
阅读 14
收藏 0
1.可以申明 指向常量的指针,此时不能通过指针来改变指针对象的值,但是指针本身可以更改,可以指向另外的对象
例如:
int a;
const int *p1 = &a;	//p1是指向常量的指针
int b; 
p1 = &b1;	        //正确,p1本身的值可以改变
*p1 = 1;	        //编译时出错,不能通过p1改变所指向的对象

使用指向常量的指针,可以确保指针所指向的常量不被意外更改,如果用一般的指针存放常量的地址,编译器就不能保证所指向的数据不被更改。

2.可以申明指针类型的常量,这时指针本身的值不能改变。
例如:

int * const p2 = @a;    
p2 = @b;  //错误,p2 是指针常量,值不能改变

3.一般情况下,指针的值只能赋给相同的数据类型的指针,但是有一种特殊的 void类型的指针,可以存储任何类型的对象地址,就是说任何类型的指针都可以赋值给void类型的指针变量。经过是有类型显示转换,通过void类型的指针变可以访问任何类型的数据。 但是不能定义void类型的变量

4.指针型函数和指向函数的指针

#include <iostream>

using namespace std;

//指针型函数 :返回指针的函数
/*
定义形式:
数据类型 * 函数名(参数列表)
{
        函数体; 
} 
*/ 

//函数指针:指向函数的指针
/*
定义形式:
数据类型 (*函数指针名)(形参列表); 
*/ 
int * intAdd(int a,int b){
    int *r;    
    int restult = a+b;
    r = &restult;
    return r;
}

int main(int argc,char *argv[]){
    int *r = intAdd(1,2);
    cout<<*r<<endl;
    
    int* (*pointFunciton)(int,int);//int* 表示该指向函数的指针返回的是一个int型的指针 
    pointFunciton = intAdd;
    
    int *r2 = pointFunciton(3,4);
    cout<<*r2<<endl;
    system("pause");    
    return 0;
}
5.打印数组

#include <iostream>
using namespace std;

void printArr1(int *arr,int n){
     for(int i=0;i<n;i++){
             cout<<arr[i]<<" ";       
     }
     cout<<endl;
}

void printArr2(int *arr,int n){
     for(int i=0;i<n;i++){
             cout<<*(arr+i)<<" ";       
     }
     cout<<endl;
}

void printArr3(int *arr,int n){
     for(int *p = arr;p<(arr+n);p++){
             cout<<*p<<" ";       
     }
     cout<<endl;
}

//打印二维数组 
void printTwoDimensionalArr(int **arr,int n,int m){
     for(int i=0;i<n;i++){
             for(int j=0;j<m;j++){
                     cout<<*(*(arr+i)+j)<<" ";
             }
             cout<<endl;
     }
}
void printTwoDimensionalArr2(int arr[3][3],int n,int m){
     for(int i=0;i<n;i++){
             for(int j=0;j<m;j++){
                     cout<<*(*(arr+i)+j)<<" ";//或者 *(arr[i]+j)
             }
             cout<<endl;
     }
}
int main(int argc,char *argv[]){
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    printArr1(a,10);
    printArr2(a,10);
    printArr3(a,10);
    cout<<"打印二维数组:"<<endl;
    
    int a1[3] = {1,2,3};
    int a2[3] = {4,5,6};
    int a3[3] = {7,8,9};
    
    int *arr2[3] = {a1,a2,a3};
    
    int arr3[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int **m = static_cast<int **>(arr2);
    printTwoDimensionalArr(m,3,3);
    printTwoDimensionalArr2(arr3,3,3);
    system("pause");
    return 0;
}

© 著作权归作者所有

上一篇: 初始值
下一篇: mysql触发器
notAcoder
粉丝 5
博文 30
码字总数 12671
作品 0
巴南
架构师
私信 提问
C语言学习之 数组,指针,字符串. (三)

保持一贯的风格, 进入正题之前,先写一段废话. 写点东西是件轻松的事, 我从未将写内容当作是一种负担. 但是生活中总有一些事情会扰乱心神. 我是说我之前想把一篇内容写全,写丰富完整事实上我写...

泡不烂的凉粉
2012/11/08
101
0
关于程序员解决问题的思考

前两天参加了一个面试,面试官出了一个问题,说怎么判断单向链表是循环列表,当时就很简单的回答,说判断最后一个指针和头指针相同则为循环列表。这个答案让考官一下否定了。因为还有一些循环...

zhouhb1
2011/08/18
0
0
关于expres模板引擎,Function,with

本文只是一些很零散的东西,关于js的模板引擎方面的知识。 看 Node in Action的时候,有一章关于ejs,看到这样的一个片段: 这个 locals 让我迷惑不解,因为根据资料,express只是暴露了一个...

m2012
2014/05/15
121
1
3、Java并发性和多线程-多线程的代价

以下内容转自http://ifeve.com/costs-of-multithreading/: 从一个单线程的应用到一个多线程的应用并不仅仅带来好处,它也会有一些代价。不要仅仅为了使用多线程而使用多线程。而应该明确在使...

easonjim
2017/06/14
0
0
【Java并发性和多线程】多线程的代价

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/costs.html 译文链接:http://ifeve.com/costs-of-multithreading/ 从一个单线程的应用到一个多线程的应用并不仅仅...

heroShane
2014/01/28
210
0

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
22分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
26分钟前
4
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
31分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
31分钟前
3
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部