1)指针与字符串
const char *arg[2];
arg[0] = "hello world from thread1";
arg[1] = "hello world from thread2";
arg[]是一个指针数组,数组里面的元素是指向char型的指针。arg[0]、arg[1]是该数组的两个元素,都是char *型,所以要赋值一个地址。
char *s="Pretend in New York!";
等价于:
char *s;
s="Pretend in New York!";
2)通过一个例子来完全了解指针
先上程序》
typedef struct {
int a;
int b;
}T_AB;
int main(int argc, char **argv)
{
char c;
int a;
T_AB tTest;
int *p;
int **pp;
/* 1. */
p = &a;
printf("p = 0x%x, a'addr = 0x%x\n", p, &a);
/* 2. */
*p = 0x12345678;
printf("a = 0x%x\n", a);
/* 3. */
p = &c;
printf("p = 0x%x, c'addr = 0x%x\n", p, &c);
/* 4. */
*p = 'A';
printf("c = %c\n", c);
/* 5. */
p = &tTest;
printf("p = 0x%x, tTest'addr = 0x%x\n", p, &tTest);
/* 6. */
*p = &tTest;
printf("tTest.a = 0x%x, tTest'addr = 0x%x\n", tTest.a, &tTest);
/* 7. */
pp = &p;
printf("pp = 0x%x, p'addr = 0x%x\n", pp, &p);
/* 8. */
**pp = 0xABCD1234;
printf("tTest.a = 0x%x\n", tTest.a);
return 0;
}
现在来绺一
绺,它们在内存中的变化情况
先假设它们存放地址:c 100; a 200; p 600; tTest 1000; pp 2000;
1> p=&a; 假设a存在地址为200的格子里,则 p=200即c8,&p即p的地址还是600.所以就是600地址里存的数是200.
2> *p=0x12345678;
p所指向的4字节(因为是int型的指针,所以是4字节),其内容是0x12345678. p指向a的地址,所以就是让a=0x12345678
3> p=&c; c的地址是100.所以p=100;
4> *p=’A’;
p所指向的4字节,其内容等于’A’.0x41
这里有一个问题,c原来只占用一个字节,现在占用了4个字节,就把原来100后面3个字节的内容给覆盖掉了.
5> p=&tTest; test的地址是1000.p的地址是600,所以地址600里的内容是1000.
6> *p=&tTest;
p所指向的4字节,其内容等于1000.所以地址1000里的内容是1000.
7> pp=&p; &p等于600,pp的地址是2000
pp所指向的4字节,其内容等于600.所以地址2000里的内容是600.
8> **pp=0xABCD1234;
可以理解为 *(*pp) ,*pp:pp的值是600,600里的内容是1000.所以*pp=1000.
*(1000)=0xABCD1234:访问地址1000,让它的内容等于0xABCD1234
地址1000存放的是tTest.a的值,所以 tTest.a=0xABCD1234.
口诀:
*变量:把变量的值作为地址,去访问这个地址的内存.
最后附上执行结果:
一般把(void*)0定义为NULL,表示这是个空指针。
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型
转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
面的语句编译出错:
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型处理。