C语言-指针

1.指针和数组
2.指针和二维数组
例如:
#include <stdio.h>
int main()
{
int a[3][4];
printf("%d\n", a);
printf(“a + 1 \t &a + 1 \t a[0] + 1 \t &a[0] + 1\n”);
printf("%d \t %d \t %d \t %d", a + 1, &a + 1, a[0] + 1, &a[0] + 1);
return 0
}
1.第一行打印的是数组的起始地址6422000 
2.由于a表示是的数组首行地址  因此a+1 中的1其实代表了数组中的一行元素的大小
 也就是4*4个字节 (一行有四个int元素 一个int有四个字节)
3.&a+1 ,&a代表的是整个数组 因此&a+1中的1其实代表了整个数组的大小,也就是344个字节34为元素个数最后的4是int表示的4个字节大小),等于48
(5)由于a[0]代表了第0行第0个元素的地址,因此a[0]+1中的1其实代表了一个元素的大小,也就是1,等于4字节
(5)由于&a[0]代表了第0行的地址,因此&a[0]+1中的1其实代表了一行元素的大小,也就是4*4个字节(同(2)),等于16


const和指针
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不会被改变。

1.修饰变量
    const int a = 5;
    int const a = 5;


上面两种写法都一样,都是表示变量a的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后不能再进行赋值,
例如:
const int a ;

a =5; /这是错误的。

2const用于修饰常量静态字符串


const char*str =“aabbcc”

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=‘z’;这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处,让逻辑错误在编译期被发现。

3.常量指针
    常量指针式指针指向的内容是常量,可以有以下两种定义方式

    const int *p;
    int const *p;

常量指针说的是不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值


    int const *p;
    int a =4;
    p =&a;
    a = 5;/正确的,p的这个时候也是等于5
    
    *p = 5/错误的,不能通过指针p来改变值
    

常量指针指向的值不能改变,但是这并不意味着指针本身不能改变,常量指针可以指向其他的地址。


int a =4 
int b =5
const int *p;
p = &a;
p = &b;








4.指针常量

指针常量是指 指针本身是个常量,不能再指向其他的地址,

int *const p;

指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。
int a = 4;
int b = 5;
int *const p = &a ;/要马上初始化,之后无法赋值
p = &b;/不正确,无法赋值
p = b;/正确

区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线。如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。


常量指针指向的值不能改变,但是可以指向其他的地址
指针常量不能改变指向的地址,但是可以改变保存的数值。


5.指针常量的常指针

指向常量的常指针是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

const int *const p;

6.修饰函数参数
防止修改指针指向的内容
void StringCopy(char *strDestination, const char *strSource);

其中strSource是输入参数,strDestination是输出参数。给strSource加上const修饰后,如果函数体内的语句试图改动strSource的内容,编译器将指出错误。    


防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 );

指针p1和指针p2指向的地址都不能修改。

7.
修饰函数返回值
如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
例如函数
const char * GetString(void);
1
如下语句将出现编译错误:

char *str = GetString();
1
正确的用法是

const char *str = GetString();


指针数组和数组指针

指针数组:一个指针,指向了数组

数组指针:定义的是一个数组,每个元素是指针





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值