int *ptr;
*ptr=5;//一个可怕的错误
ptr并没有被初始化,它的值是随机的,因此不知道5被存储在什么位置。当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配存储数据的内存空间。
const int a[2]={1,3,4,5,6};//保证数组的内容不被改变
以下代码中:
#include#define SIZE 5
void show(const double ar[], int n);
void mult_array(double ar[], int n, double mult);
void show(const double ar[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%8.3f ", ar[i]);
putchar('\n');
}
void mult_array(double ar[], int n, double mult)
{
int i;
for (i = 0; i < n; i++)
ar[i] *= mult;
putchar(10);
}
int main()
{
const double arr[SIZE] = { 1, 2, 3, 4, 5 };
show(arr, SIZE);
mult_array(arr, SIZE, 5);
show(arr, SIZE);
return 0;
}
arr数组即使加了const修饰,在mult_array中仍然能通过运行,在调用之后,成功修改了arr数组的值。
还是与上一个有关,假设:
int var=5;
const int *p1=&var;//不能通过修改*p1来改变var的值
int *p2=p1;//可以把p1赋值给一个指向非常量的指针p2,通过修改p2的值来修改var的值
(上面语句在c++中编译不通过,Only c)(IDE是vs2013)
c-primer-plus也说这种赋值是不可以的,只有非常量数据的地址才能赋值给普通的指针
可以用#define 定义字符串常量,字符串常量属于静态存储类(一份拷贝,多次使用),整个引号的内容作为指向该字符串存储位置的指针。
printf("%c %c\n",*"howell",*("howell"+1));
如果“howell”是一个地址,那么第一个%c输出的应该是howell所指向的地址中的值,第二个%c应该是howell所指向的地址的下一个地址的值。结果是“h o”
指定字符串数组大小时,一定要保证数组长度比字符串长度至少多1.
数组和指针:
char *head1="I love programming";
char head2[]="I love programming";
两者都可以用数组符号,如head1[1],head2[1];也都可以用指针加法,*(head1+i),*(head2+i)
#include<sys/time.h>
int gettimeofday(struct timeval *tv,NULL);//将从1970年元旦开始计时经过的时间赋值给struct
struct timeval
{
time_t tv_sec;//秒数
suseconds tv_usec;//微妙数
};
int main()
{
strcut timeval *pval;
gettimeofday(pval,NULL);//此处调用会出现错误,原因是并不知道pval指向什么位置,就类似于
//int *p=3;
}
正确的写法应该是:
struct timeval val;
gettimeofday(&val,NULL);
struct A{
int aa;
};
struct B{struct A *pa;};
strcut B *pb=malloc(sizeof(struct B));之后,struct A还是要重新申请内存空间
网友评论