欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于指针的一些事情

程序员文章站 2024-03-14 18:10:28
...
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;
}

转载于:https://my.oschina.net/hujunil1/blog/164979