char *d; //char类型的指针d的定义
short *e; //short类型的指针e的定义
long *f; //long类型的指针f的定义
假设d、e、f的值都是100。在这种情况下,使用d时就能够从编号100的地址中读写1个字节的数据,使用e时就是2个字节(100地址和101地址)的数据,使用f时就是4个字节(100地址~103地址)的数据。怎么样?指针是不是很简单呢(图4-5)。int *p;
scanf("%d", p);
scanf("%d", &p);
char a[20]="12345", *p=a;
printf("%c\n", *p); //1
printf("%s\n", p); //12345
char str[]="123456889";
char *p;
p=str;
p="34546";
char *ps=&(*("123"));
char *p1;
int main()
{
char *p2, *p3;
p3=(char*)malloc(sizeof(char));
}
此时此刻,p1和p2都是一样的情况,本身有地址,但是内容区域是空的(因为没有分配存储空间,导致使用取内容符号会报错);而p3属于常规申请内存操作。
int main()
{
int n=10,n1=20; // 值的变量
int *a=&n; // 地址的变量,其实与值的变量一样的,只是值的变量,这个变量的值在变,地址不变;而地址的变量,地址在变(当然这里的地址对应的值是跟地址绑定在一起的)
int *c=a;
printf("a == %d\n",a);
printf("a == %d\n",*a);
printf("c == %d\n",c);
printf("c == %d\n\n",*c);
*a=1000;
printf("a == %d\n",a);
printf("a == %d\n",*a);
printf("c == %d\n",c);
printf("c == %d\n\n",*c);
a=&n1; // a地址改变了对c没有影响
printf("a == %d\n",a);
printf("a == %d\n",*a);
printf("c == %d\n",c);
printf("c == %d\n\n",*c);
int *&b=a; // b就代表a,单单只是名字不一样
printf("a == %d\n",a);
printf("a == %d\n",*a);
printf("b == %d\n",b);
printf("b == %d\n\n",*b);
b=c; // b地址改变了对a有影响
printf("a == %d\n",a);
printf("a == %d\n",*a);
printf("b == %d\n",b);
printf("b == %d\n",*b);
printf("c == %d\n",c);
printf("c == %d\n\n",*c);
return 0;
}
struct node
{
int val;
node *left;
node *right;
// 这里left、right一定要初始化NULL,否则遍历的时候指针乱值并不等于NULL
node(const int x):val(x),left(NULL),right(NULL){}
};
void preTraversal(node *t) // 前序遍历
{
if(t)
{
printf("%d ",t->val);
preTraversal(t->left);
preTraversal(t->right);
}
}
int main()
{
node *rt=new node(-1);
rt->left=new node(1);
rt->right=new node(2);
rt->left->left=new node(3);
preTraversal(rt);
puts("\n");
node *newNode=new node(4); // 修改叶子结点(不影响)
rt->left->left=newNode;
preTraversal(rt);
puts("\n");
newNode=new node(5); // 修改中间结点(上下都有相连)(下面的有影响)
rt->left=newNode;
preTraversal(rt);
return 0;
}
#include
using namespace std;
int main()
{
int a[2][3]={0,2,4,6,8,10};
cout<
#include
using namespace std;
struct node
{
int d;
node * next;
};
int main()
{
node *L,*L2,*nd=new node;
nd->d=1; nd->next=NULL;
L2=L=nd;
printf("L2 == %d\n",L2);
printf("L == %d\n",L);
L=NULL; // 对L2没有影响,因为指针就像个临时工,给它什么地址,就去另外一个地址做事情
printf("L2 == %d\n",L2);
printf("L == %d\n",L);
return 0;
}
Console:
L2 == 16126224
L == 16126224
L2 == 16126224
L == 0
#include
using namespace std;
int main()
{
int ary[3][3]={10,11,12,20,21,22,30,31,32};
int *p1,*p2;
p2=p1=&ary[0][0];
printf("%d %d\n",*p2,*(p1+0));
printf("%d %d\n",*(++p2),ary[2][2]);
printf("%d %d\n",*(p2+1),*(p1+1)+1);
return 0;
}
Console:
10 10
11 32
12 12
#include
using namespace std;
void swap(int &a, int &b)
{
// 引用复制,不是改变它地址,而是改变该地址对应的内容
int &c=a;
int d=a;
// printf("%d\n",&c);
// printf("%d\n",&d);
a=b;
// printf("%d\n",&a);
// printf("%d\n",&b);
b=d;
return;
}
int main()
{
int a=2,b=3;
printf("%d\n",&a);
printf("%d\n",&b);
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
#include
using namespace std;
void swap(int *a,int *b)
{
// printf("%d\n",a);
// printf("%d\n",b);
int c=*a;
*a=*b;
*b=c;
return;
}
int main()
{
int a=2,b=3;
// printf("%d\n",&a);
// printf("%d\n",&b);
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
#include
using namespace std;
typedef char** s;
int main()
{
int i,rowlen=3,colen=4;
s S;
S=new char*[rowlen];
for(i=0;i>S[i];
}
for(i=0;i