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();
指针数组和数组指针
指针数组:一个指针,指向了数组
数组指针:定义的是一个数组,每个元素是指针
C语言-指针
最新推荐文章于 2024-10-16 10:33:19 发布