指针初始化,为什么C语言指针初始化左边是值?
C语言中的指针,其实也是一种变量,只不过这种变量稍微有点特殊,指针变量存储的值是内存地址,普通变量比如int变量存储的值就是对应的int值。
对于变量初始化或者赋值来说,等号"="右边取得都是该变量存储的值,针对指针变量来说其存储的值是地址。示例代码如下:
关于更多的C指针知识,推荐可以参考下C语言经典书《C程序设计语言》和《C和指针》。
怎么给指针数组分配内存和初始化?
指针数组, 每个指针要单独分配内存,不过 如果各个指针上分配长度不相等,那么需要自行记住每个指针上内存的大小, 避免越界。
可以使用循环进行分配及初始化。
以定义一个5个元素的int*数组, 每个上分配10个int型空间,并初始化为0为例
int *a[5];int i,j;for(i = 0; i < 5; i ++){ a[i] = (int *)malloc(sizeof(int)*10); for(j = 0; j < 10; j ++) a[i][j] = 0;}
什么类型初始化指针?
指针初始化,是程序的一种语言,主要用于程序运算。
初始化
int i=10;
int * a = &i;
int * a = NULL;(编译没问题,运行错误,指针所指向地址必须为合法有效的内存地址)
a = (int *)malloc(10*sizeof(int));
a = 1;
int * a =10;(错误写法,给指针赋值必须为地址,*p为所指向变量的值)
int *a=&i;
int * c = a + 15;(a代表数组首地址,右侧表达式表示地址向高位移动15位指针所指类型字节即移动4*15字节)
a的地址是10,c的地址是10+ 4*15,因为a的类型是int *,地址增长时加整型的长度。
字符型指针初始化
char str="ksjdkghdksf";
str是一个数组首地址
数组里面的内容是一个字符串
char * pstr="aslgkjklahjkla";
pstr是指向字符串常量的首地址的指针,编译器将字符串常量放在只读数据段.
注意,是只读数据段里面的数据是不可更改的
什么时候指针常量可以不初始化?
C语言中指针变量在声明时,可以不用初始化。
定义一个指针可以不用初始化,但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。
如:int* p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。
int a;
p=&a;//将p指向变量a,此时p的指向是确定的
当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位置,所以上面的操作是正确的。
为什么常量指针可以不初始化?
不是的。
常量指针必须初始化,常量指针必须在定义时就初始化,否则系统是会报错的。
常量指针的指向地址是不允许进行修改的,如不在定义时初始化,系统随便提供的一个指针地址对于程序员来说没有占有感,就像用的个二手指针一样。
譬如:
int *const p; // 错误,系统报错。
int const *p; // 编译通过。
还没有评论,来说两句吧...